pax_global_header00006660000000000000000000000064130121530020014475gustar00rootroot0000000000000052 comment=ae760a15c81fa268981751be3cfe6383aa85d565 onionshare-0.9.2/000077500000000000000000000000001301215300200136525ustar00rootroot00000000000000onionshare-0.9.2/.gitignore000066400000000000000000000006031301215300200156410ustar00rootroot00000000000000*.py[cod] # C extensions *.so # Packages *.egg *.egg-info *.eggs dist deb_dist build eggs parts var sdist develop-eggs .installed.cfg MANIFEST env onionshare-*.tar.gz # Installer logs pip-log.txt # Unit test / coverage reports .coverage .tox nosetests.xml # Translations *.mo # Mr Developer .mr.developer.cfg .project .pydevproject # vim *.swp # tags ctags tags # OSX .DS_Store onionshare-0.9.2/.travis.yml000066400000000000000000000004261301215300200157650ustar00rootroot00000000000000language: python sudo: required dist: trusty python: - "3.4" - "3.5" # command to install dependencies before_install: "sudo apt-get update; sudo apt-get install -y python3-nose python3-flask python3-stem python3-pyqt5" install: "" # command to run tests script: nosetests3 onionshare-0.9.2/BUILD.md000066400000000000000000000145211301215300200150360ustar00rootroot00000000000000# Building OnionShare ## GNU/Linux Start by getting a copy of the source code: ```sh git clone https://github.com/micahflee/onionshare.git cd onionshare ``` *For .deb-based distros (like Debian, Ubuntu, Linux Mint):* Then install the needed dependencies: ```sh sudo apt-get install -y python3-flask python3-stem python3-pyqt5 python-nautilus ``` After that you can try both the CLI and the GUI version of OnionShare: ```sh ./install/scripts/onionshare ./install/scripts/onionshare-gui ``` A script to build a .deb package and install OnionShare easily is also provided for your convenience: ```sh sudo apt-get install -y build-essential fakeroot python3-all python3-stdeb dh-python python-nautilus python3-nose ./install/build_deb.sh sudo dpkg -i deb_dist/onionshare_*.deb ``` Note that OnionShare uses stdeb to generate Debian packages, and `python3-stdeb` is not available in Ubuntu 14.04 (Trusty). Because of this, you can't use the `build_install.sh` script to build the .deb file in versions of Ubuntu 14.04 and earlier. However, .deb files you build in later versions of Ubuntu will install and work fine in 14.04. *For .rpm-based distros (Red Hat, Fedora, CentOS):* ```sh sudo sudo dnf install -y rpm-build python3-flask python3-stem python3-qt5 nautilus-python ./install/build_rpm.sh sudo yum install -y dist/onionshare-*.rpm ``` Depending on your distribution, you may need to use `yum` instead of `dnf`. *For ArchLinux:* There is a PKBUILD available [here](https://aur.archlinux.org/packages/onionshare/) that can be used to install OnionShare. ## Mac OS X Install Xcode from the Mac App Store. Once it's installed, run it for the first time to set it up. If you don't already have it installed, install [Homebrew](http://brew.sh/). Install some dependencies using Homebrew: ```sh brew install python3 pyqt5 qt5 ``` Install some dependencies using pip3: ```sh sudo pip3 install flask stem ``` Install the latest development version of cx_Freeze: * Download a [snapshot](https://bitbucket.org/anthony_tuininga/cx_freeze/downloads) of the latest development version of cx_Freeze, extract it, and cd into the folder you extracted it to * Build the package: `python3 setup.py bdist_wheel` * Install it with pip: `sudo pip3 install dist/cx_Freeze-5.0-cp35-cp35m-macosx_10_11_x86_64.whl` Get the source code: ```sh git clone https://github.com/micahflee/onionshare.git cd onionshare ``` To build the .app: ```sh install/build_osx.sh ``` Now you should have `dist/OnionShare.app`. To codesign and build a .pkg for distribution: ```sh install/build_osx.sh --release ``` Now you should have `dist/OnionShare.pkg`. ## Windows ### Setting up your dev environment These instructions include adding folders to the path in Windows. To do this, go to Start and type "advanced system settings", and open "View advanced system settings" in the Control Panel. Click Environment Variables. Under "System variables" double-click on Path. From there you can add and remove folders that are available in the PATH. Download the latest Python 3.5.x, 32-bit (x86) from https://www.python.org/downloads/. I downloaded `python-3.5.2.exe`. When installing it, make sure to check the "Add Python 3.5 to PATH" checkbox on the first page of the installer. Download and install Qt5 from https://www.qt.io/download-open-source/. I downloaded `qt-unified-windows-x86-2.0.3-1-online.exe`. There's no need to login to a Qt account during installation. Make sure you install the latest Qt 5.x. Open a command prompt and install dependencies with pip: `pip install pypiwin32 flask stem PyQt5` Download and install the [Microsoft Visual C++ 2008 Redistributable Package (x86)](http://www.microsoft.com/en-us/download/details.aspx?id=29). Installing cx_Freeze with support for Python 3.5 is annoying. Here are the steps (thanks https://github.com/sekrause/cx_Freeze-Wheels): * Download and install the Visual C++ Build Tools 2005 from http://go.microsoft.com/fwlink/?LinkId=691126. I downloaded `visualcppbuildtools_full.exe`. * Install the python wheel package: `pip install wheel` * Download a [snapshot](https://bitbucket.org/anthony_tuininga/cx_freeze/downloads) of the latest development version of cx_Freeze, extract it, and cd into the folder you extracted it to * Build the package: `python setup.py bdist_wheel` * Install it with pip: `pip install dist\cx_Freeze-5.0-cp35-cp35m-win32.whl` If you want to build the installer: * Go to http://nsis.sourceforge.net/Download and download the latest NSIS. I downloaded `nsis-3.0-setup.exe`. * Add `C:\Program Files (x86)\NSIS` to the path. If you want to sign binaries with Authenticode: * You'll need a code signing certificate. I roughly followed [this guide](http://blog.assarbad.net/20110513/startssl-code-signing-certificate/) to make one using my StartSSL account. * Once you get a code signing key and certificate and covert it to a pfx file, import it into your certificate store. * Windows 7: * Go to http://msdn.microsoft.com/en-us/vstudio/aa496123 and install the latest .NET Framework. I installed `.NET Framework 4.6`. * Go to http://www.microsoft.com/en-us/download/confirmation.aspx?id=8279 and install the Windows SDK. * Add `C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin` to the path. * Windows 10: * Go to https://dev.windows.com/en-us/downloads/windows-10-sdk and install the standalone Windows 10 SDK. Note that you may not need this if you already have Visual Studio. * Add `C:\Program Files (x86)\Windows Kits\10\bin\x86` to the path. ### To make a .exe: * Open a command prompt, cd into the onionshare directory, and type: `python setup.py build`. `onionshare.exe`, `onionshare-gui.exe`, and all of their supporting files will get created inside the `build\exe.win32-3.5` folder. ### To build the installer: Note that you must have a codesigning certificate installed in order to use the `install\build_exe.bat` script, because it codesigns `onionshare.exe`, `uninstall.exe`, and `OnionShare_Setup.exe`. Open a command prompt, cd to the onionshare directory, and type: `install\build_exe.bat` This will prompt you to codesign three binaries and execute one unsigned binary. When you're done clicking through everything you will have `dist\OnionShare_Setup.exe`. ## Tests OnionShare includes [nose](https://nose.readthedocs.org/en/latest/) unit tests. First, `sudo apt-get install python3-nose` or `sudo pip3 install nose`. To run the tests: ```sh nosetests3 test ``` onionshare-0.9.2/CHANGELOG.md000066400000000000000000000077011301215300200154700ustar00rootroot00000000000000# OnionShare Changelog ## 0.9.2 (Linux only) * Looks for `TOR_CONTROL_PORT` environment variable, to help Tails integration * Change how OnionShare checks to see if it's installed system-wide, to help Subgraph OS integration ## 0.9.1 * Added Nautilus extension, so you can right-click on a file and choose "Share via OnionShare", thanks to Subgraph developers * Switch to using the term "onion service" rather than "hidden service" * Fix CVE-2016-5026, minor security issue related to use of /tmp directory * Switch from PyInstaller to cx_Freeze for Windows and OSX packaging * Support CLI in Windows and OSX ## 0.9 * Slugs are now shorter and human-readable, with rate limiting to prevent URL guessing * Uses a new slug each time the server restarts * "Stop sharing automatically" enforces only one download * Users get asked if they're sure they want to close OnionShare while server is running * Added estimated time remaining progress indicator * Fixed frozen window while waiting for hidden service to start * Displays version number in both GUI and CLI * Closing window causes downloads to stop immediately * Web server listens in ports 17600-17650, for future Tails support * Updated translations * Ported from Python 2 to Python 3 and from Qt4 to Qt5 * Ported from py2app and py2exe to PyInstaller ## 0.8.1 * Fixed crash in Windows 7 * Fixed crash related to non-ephemeral hidden services in Linux * Fixed minor bugs ## 0.8 * Add support for ephemeral hidden services * Stopped leaking sender's locale on download page * Add support for Tor Messenger as provider of Tor service * Minor bugfixes, code cleanup, and refactoring ## 0.7.1 * Fixed critical bug in OS X binaries that caused crashes on some computers * Added Security Design document * Minor bug fix with Windows code signing timestamp server * Linux version uses HS dir that is allowed by Tor Browser Launcher's AppArmor profiles ## 0.7 * Added code signing for Mac OS X * Does not disable existing hidden services * Uses allowZip64 to allow compressing files >5gb * Sets HS dir to be in /var/lib/tor in Tails, to obey AppArmor rules * Misc. minor code cleanup ## 0.6 * Brand new drag-and-drop GUI with ability to start and stop server * Much cleaner code split into several files * Support for sharing multiple files and folders at once, and automatically zips files before sharing * Redesigned receiver HTML interface * Waits for hidden service to be available before displaying URL * Cleans up hidden service directory on exit * Continuous integration with Travis * Support for multiple downloads at once * Fixed unicode-related filename and display bugs * Warns that large files could take hours to send * New translations * Several misc. bugfixes * Added code signing for Windows with Authenticode ## 0.5 * Removed webkit GUI altogether, and refactored GUI with native Qt widget * In Tails, launches separate process as root for Tor control port and firewall stuff, everything else runs as amnesia * Fixed itsdangerous dependency bug in Debian Wheezy and Tails * Guesses content type of file, responds in HTTP header ## 0.4 * Fixed critical XSS bug that could deanonymize user: https://micahflee.com/2014/07/security-advisory-upgrade-to-onionshare-0-4-immediately/ * Added CSP headers in GUI to prevent any future XSS bugs from working * Hash urandom data before using it, to avoid leaking state of entropy * Constant time compare the slug to avoid timing attacks * Cleaned up Tails firewall code ## 0.3 * Built a simple, featureful cross-platform GUI * Graphical installers for Windows and OSX * Packaged for Linux in .deb, .rpm, with desktop launcher * Installable in Tails 1.1+, with simple "install" script * Automatically copies URL to clipboard * Automatically closes when download is done by default * Shows download progress * Limited suite of tests * If a localized string doesn't exist, falls back to English * New translations: Dutch, Portuguese, German, Russian, and updated translations: Norwegian, Spanish, French, Italian onionshare-0.9.2/LICENSE000066400000000000000000001046141301215300200146650ustar00rootroot00000000000000OnionShare Copyright © 2016 Micah Lee 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 . onionshare-0.9.2/MANIFEST.in000066400000000000000000000004601301215300200154100ustar00rootroot00000000000000include LICENSE include README.md include BUILD.md include resources/* include resources/images/* include resources/locale/* include resources/html/* include install/onionshare.desktop include install/onionshare.appdata.xml include install/onionshare80.xpm include install/scripts/onionshare-nautilus.py onionshare-0.9.2/README.md000066400000000000000000000057041301215300200151370ustar00rootroot00000000000000# OnionShare [![Build Status](https://travis-ci.org/micahflee/onionshare.png)](https://travis-ci.org/micahflee/onionshare) OnionShare lets you securely and anonymously share files of any size. It works by starting a web server, making it accessible as a Tor onion service, and generating an unguessable URL to access and download the files. It doesn't require setting up a server on the internet somewhere or using a third party filesharing service. You host the file on your own computer and use a Tor onion service to make it temporarily accessible over the internet. The other user just needs to use Tor Browser to download the file from you. Features include: * A user-friendly drag-and-drop graphical user interface that works in Windows, Mac OS X, and Linux * Ability to share multiple files and folders at once * Support for multiple people downloading files at once * Automatically copies the unguessable URL to your clipboard * Shows you the progress of file transfers * When file is done transferring, automatically closes OnionShare to reduce the attack surface * Localized into several languages, and supports international unicode filenames If you're interested in exactly what OnionShare does and does not protect against, read the [Security Design Document](/SECURITY.md). ![Client Screenshot](/screenshots/client.png) ![Server Screenshot](/screenshots/server.png) ## Quick Start You can download OnionShare to install on your computer from . You can set up your development environment to build OnionShare yourself by following [these instructions](/BUILD.md). ## How to Use Before you can share files, you need to open [Tor Browser](https://www.torproject.org/) in the background. This will provide the Tor service that OnionShare uses to start the onion service. Open OnionShare and drag and drop files and folders you wish to share, and click Start Sharing. It will show you a .onion URL such as `http://asxmi4q6i7pajg2b.onion/egg-cain` and copy it to your clipboard. This is the secret URL that can be used to download the file you're sharing. If you'd like multiple people to be able to download this file, uncheck the "close automatically" checkbox. Send this URL to the person you're trying to send the files to. If the files you're sending aren't secret, you can use normal means of sending the URL: emailing it, posting it to Facebook or Twitter, etc. If you're trying to send secret files then it's important to send this URL securely. The person who is receiving the files doesn't need OnionShare. All they need is to open the URL you send them in Tor Browser to be able to download the file. ## Using the command line version In Linux: Just run `onionshare` from the terminal. In Windows: Add `C:\Program Files (x86)\OnionShare` to your PATH. Now you can run `onionshare.exe` in a command prompt. In Mac OS X: Run `ln -s /Applications/OnionShare.app/Contents/MacOS/onionshare /usr/local/bin`. Now you can run `onionshare` from the terminal. onionshare-0.9.2/SECURITY.md000066400000000000000000000113501301215300200154430ustar00rootroot00000000000000# Security Design Document ## How it works OnionShare is a tool that helps users securely and anonymously share files over the internet. First, the sender chooses files and folders they wish to share with the recipient. OnionShare then starts a web server at `127.0.0.1` on a random port. It chooses two words from a 6800-long wordlist called a slug, and makes the files available for download at `http://127.0.0.1:[port]/[slug]/`. It then makes the web server accessible as Tor onion service, and displays the URL `http://[onionservice].onion/[slug]` to the sender to share. A final OnionShare URL looks something like `http://f5ratndpx7rgvh7i.onion/fold-foxy`. The sender is responsible for securely sharing that URL with the recipient using a communication channel of their choice, such as in an encrypted email, chat, or voice call, or something less secure like a Twitter or Facebook message, depending on their threat model. The recipient must use Tor Browser to load the URL and download the files. As soon as the shared files get downloaded, or when the sender closes OnionShare, the Tor onion service and web servers shut down, completely removing the files from the internet (there is an option to not shut down after the first download, to allow the files to be downloaded multiple times). Because of this, OnionShare is most useful if it's used in real-time. For example, if a user runs OnionShare on their laptop, and then suspends their laptop before the files have been downloaded, the service will not be available until the laptop is unsuspended and connected to the internet again. ## What it protects against * **Third parties don't have access to files being shared.** The files are hosted directly on the sender's computer and don't get uploaded to any server. Instead, the sender's computer becomes the server. Traditional ways of sending files, like in an email or using a cloud hosting service, require trusting the service with access to the files being shared. * **Network eavesdroppers can't spy on files in transit.** Because connections between Tor onion services and Tor Browser are end-to-end encrypted, no network attackers can eavesdrop on the shared files while the recipient is downloading them. If the eavesdropper is positioned on the sender's end, the recipient's end, or is a malicious Tor node, they will only see Tor traffic. If the eavesdropper is a malicious rendezvous node used to connect the recipient's Tor client with the sender's onion service, the traffic will be encrypted using the onion service key. * **Anonymity of sender and recipient are protected by Tor.** OnionShare and Tor Browser protect the anonymity of the users. As long as the sender anonymously communicates the OnionShare URL with the recipient, the recipient and eavesdroppers can't learn the identity of the sender. * **If an attacker enumerates the onion service, the shared files remain safe.** There have been attacks against the Tor network that can enumerate onion services. If someone discovers the .onion address of an OnionShare onion service, they still cannot download the shared files without knowing the slug. The slug is generated by choosing two random words from a list of 6800 words, meaning there are 6800^2, or about 46 million possible slugs. But they can only make 20 wrong guesses before OnionShare stops the server, preventing brute force attacks against the slug. The OnionShare server also checks request URIs using a constant time string comparison function, so timing attacks can't be used to help guess the slug. ## What it doesn't protect against * **Communicating the OnionShare URL might not be secure.** The sender is responsible for securely communicating the OnionShare URL with the recipient. If they send it insecurely (such as through an email message, and their email is being monitored by an attacker), the eavesdropper will learn that they're sending files with OnionShare. If the attacker loads the URL in Tor Browser before the legitimate recipient gets to it, they can download the files being shared. If this risk fits the sender's threat model, they must find a more secure way to communicate the URL, such as in an encrypted email, chat, or voice call. This isn't necessary in cases where the files being shared aren't secret. * **Communicating the OnionShare URL might not be anonymous.** While OnionShare and Tor Browser allow for anonymously sending files, if the sender wishes to remain anonymous they must take extra steps to ensure this while communicating the OnionShare URL. For example, they might need to use Tor to create a new anonymous email or chat account, and only access it over Tor, to use for sharing the URL. This isn't necessary in cases where there's no need to protect anonymity, such as coworkers who know each other sharing work documents. onionshare-0.9.2/git-hooks/000077500000000000000000000000001301215300200155565ustar00rootroot00000000000000onionshare-0.9.2/git-hooks/README.md000066400000000000000000000002051301215300200170320ustar00rootroot00000000000000To use these hooks, cp any of them to onionshare's `.git/hooks`. * `pre-push` runs the test suite, and will push if the tests pass. onionshare-0.9.2/git-hooks/pre-push000077500000000000000000000002371301215300200172510ustar00rootroot00000000000000#!/bin/bash # Pre-push hook. If you want to test with a different version of firefox, put # the path in the CFX_FIREFOX environment variable. nosetests test onionshare-0.9.2/install/000077500000000000000000000000001301215300200153205ustar00rootroot00000000000000onionshare-0.9.2/install/Info.plist000066400000000000000000000010571301215300200172730ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable onionshare-gui CFBundleIdentifier com.micahflee.onionshare NSHighResolutionCapable CFBundleShortVersionString {VERSION} CFBundleIconFile icon.icns onionshare-0.9.2/install/build_deb.sh000077500000000000000000000007501301215300200175720ustar00rootroot00000000000000#!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" cd $DIR VERSION=`cat resources/version.txt` # clean up from last build rm -r deb_dist >/dev/null 2>&1 # build binary package python3 setup.py --command-packages=stdeb.command bdist_deb # return install instructions if onionshare builds properly echo "" if [[ $? -eq 0 ]]; then echo "To install, run:" echo "sudo dpkg -i deb_dist/onionshare_$VERSION-1_all.deb" else echo "OnionShare failed to build!" fi onionshare-0.9.2/install/build_exe.bat000066400000000000000000000012461301215300200177530ustar00rootroot00000000000000REM build onionshare.exe, onionshare-gui.exe python setup.py build REM sign onionshare.exe, onionshare-gui.exe signtool.exe sign /v /d "OnionShare" /a /tr http://timestamp.globalsign.com/scripts/timstamp.dll /fd sha256 build\exe.win32-3.5\onionshare.exe signtool.exe sign /v /d "OnionShare" /a /tr http://timestamp.globalsign.com/scripts/timstamp.dll /fd sha256 build\exe.win32-3.5\onionshare-gui.exe REM build an installer, dist\OnionShare_Setup.exe mkdir dist makensis.exe install\onionshare.nsi REM sign OnionShare_Setup.exe signtool.exe sign /v /d "OnionShare" /a /tr http://timestamp.globalsign.com/scripts/timstamp.dll /fd sha256 dist\OnionShare_Setup.exe onionshare-0.9.2/install/build_osx.sh000077500000000000000000000014701301215300200176510ustar00rootroot00000000000000#!/bin/bash ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" cd $ROOT # deleting dist echo Deleting dist folder rm -rf $ROOT/build $ROOT/dist &>/dev/null 2>&1 # build the .app echo Building OnionShare.app python3 setup.py bdist_mac if [ "$1" = "--release" ]; then mkdir -p dist APP_PATH="build/OnionShare.app" PKG_PATH="dist/OnionShare.pkg" IDENTITY_NAME_APPLICATION="Developer ID Application: Micah Lee" IDENTITY_NAME_INSTALLER="Developer ID Installer: Micah Lee" echo "Codesigning the app bundle" codesign --deep -s "$IDENTITY_NAME_APPLICATION" "$APP_PATH" echo "Creating an installer" productbuild --sign "$IDENTITY_NAME_INSTALLER" --component "$APP_PATH" /Applications "$PKG_PATH" echo "Cleaning up" rm -rf "$APP_PATH" echo "All done, your installer is in: $PKG_PATH" fi onionshare-0.9.2/install/build_rpm.sh000077500000000000000000000006361301215300200176410ustar00rootroot00000000000000#!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" cd $DIR VERSION=`cat resources/version.txt` # clean up from last build rm -r build dist >/dev/null 2>&1 # build binary package python3 setup.py bdist_rpm --requires="python3-flask, python3-stem, python3-qt5, nautilus-python" # install it echo "" echo "To install, run:" echo "sudo dnf install dist/onionshare-$VERSION-1.noarch.rpm" onionshare-0.9.2/install/check_lacked_trans.py000066400000000000000000000056301301215300200214650ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ Check translation lacked or disused. Example: in OnionShare directory $ check_lacked_trans.py de disused choose_file de disused gui_starting_server de lacked gui_canceled de lacked gui_starting_server1 de lacked gui_starting_server2 de lacked gui_starting_server3 en disused choose_file es disused choose_file es disused gui_starting_server ... 1. search `{{strings.translation_key}}` and `strings._('translation_key')` from .py or .html files. 2. load translation key from locale/*.json. 3. compare these. """ import fileinput, argparse, re, os, codecs, json, sys def arg_parser(): desc = __doc__.strip().splitlines()[0] p = argparse.ArgumentParser(description=desc) p.add_argument('-d', default='.', help='onionshare directory', metavar='ONIONSHARE_DIR', dest='onionshare_dir') p.add_argument('--show-all-keys', action='store_true', help='show translation key in source and exit') return p def files_in(*dirs): dir = os.path.join(*dirs) files = os.listdir(dir) return [os.path.join(dir, f) for f in files] def main(): parser = arg_parser() args = parser.parse_args() dir = args.onionshare_dir src = files_in(dir, 'onionshare') + files_in(dir, 'onionshare_gui') pysrc = [p for p in src if p.endswith('.py')] htmlsrc = [p for p in src if p.endswith('.html')] translate_keys = set() # load translate key from python source for line in fileinput.input(pysrc, openhook=fileinput.hook_encoded('utf-8')): # search `strings._('translate_key')` # `strings._('translate_key', True)` m = re.search(r'strings\._\((.*?)\)', line) if m: arg = m.group(1) key = arg.split(',')[0].strip('''"' ''') translate_keys.add(key) # load translate key from html source for line in fileinput.input(htmlsrc, openhook=fileinput.hook_encoded('utf-8')): # search `{{strings.translate_key}}` m = re.search(r'{{.*strings\.([-a-zA-Z0-9_]+).*}}', line) if m: key = m.group(1) translate_keys.add(key) if args.show_all_keys: for k in sorted(translate_keys): print k sys.exit() locale_files = [f for f in files_in(dir, 'locale') if f.endswith('.json')] for locale_file in locale_files: with codecs.open(locale_file, 'r', encoding='utf-8') as f: trans = json.load(f) # trans -> {"key1": "translate-text1", "key2": "translate-text2", ...} locale_keys = set(trans.keys()) disused = locale_keys - translate_keys lacked = translate_keys - locale_keys locale, ext = os.path.splitext(os.path.basename(locale_file)) for k in sorted(disused): print locale, 'disused', k for k in sorted(lacked): print locale, 'lacked', k if __name__ == '__main__': main() onionshare-0.9.2/install/onionshare.appdata.xml000066400000000000000000000032501301215300200216200ustar00rootroot00000000000000 onionshare.desktop CC0-1.0 GPL-3.0 OnionShare Securely and anonymously share a file of any size

OnionShare lets you securely and anonymously share a file of any size with someone. It works by starting a web server, making it accessible as a Tor hidden service, and generating an unguessable URL to access and download the file.

It doesn't require setting up a server on the internet somewhere or using a third party filesharing service. You host the file on your own computer and use a Tor hidden service to make it temporarily accessible over the internet. The other user just needs to use Tor Browser to download the file from you.

https://raw.githubusercontent.com/micahflee/onionshare/master/screenshots/appdata-server.png Sender sharing files with OnionShare https://raw.githubusercontent.com/micahflee/onionshare/master/screenshots/appdata-client.png Receiver downloading files with Tor Browser https://onionshare.org/ micah@micahflee.com
onionshare-0.9.2/install/onionshare.desktop000066400000000000000000000004311301215300200210560ustar00rootroot00000000000000[Desktop Entry] Name=OnionShare Comment=Share a file securely and anonymously over Tor Exec=/usr/bin/onionshare-gui Terminal=false Type=Application Icon=/usr/share/pixmaps/onionshare80.xpm Categories=Network; Keywords=tor;anonymity;privacy;onion service;file sharing;file hosting; onionshare-0.9.2/install/onionshare.icns000066400000000000000000001025701301215300200203500ustar00rootroot00000000000000icnsxis32 NNPUQSOKKOSQUPNDPMBJWWJBMQDNNHPHN۞OIQCAMPKf^IQPLQHTPMQREdYnGIsDSG\AFPQ=uEMYLONRcgUUg\TNOMYM]Em=OMDF\GSD{QPVdERQMPTHQLPQI^fKPMACQIO۞NHPHNNDQMBJWWJBMPDN PUQSOKKOSQUPNN   m  t yy  .$  -9@w!D   +//    ]: !wJd,  $.  yy t  m   NNPUQSOKKOSQUPNDPMBJWWJBMQDNNHPHN۞OIQCAMPKf^IQPLQHTPMQREdYnGIsDSG\AFPQ=uEMYLONRcgUUg\TNOMYM]Em=OMDF\GSD{QPVdERQMPTHQLPQI^fKPMACQIO۞NHPHNNDQMBJWWJBMPDN PUQSOKKOSQUPNNs8mk66::ߟ::66il32NNOONN OQPNKKNPQONN OPHAFOXXOFAHPONNQIDhΠhDIQNPCbbCPNOBBPNPFBPNPI CQNPF<īcIONPCb9VDBBEcDPN Q@V;KOFfNKPNPCCFLOQPNKBNKOGeMKPNxTJBDM[KOGdXIPNPD~ѿKNKLONPDJKPNOMNSMONPJYZKONPIXWHPNPJMMJPNN PMD~ ~DMPNNOPDNԊNDPONNPNCIhhICNPNNQOHBCJRWWRJCBHOQNN OQPOMKKMOPQONNONNNN      0tt0   __   OO              ԕlNV|O , X ͋  ,  <]  / q  ,  /  Q/  . r . F .    3     '  %+( (+c% '  x   3   .   . r .  /;  /  -  y /  ]Q   ,  F k , O              OO   __   0tt0      NNNNONN OQPOMKKMOPQONNQOHBCJRWWRJCBHOQNNPNCIhhICNPNNOPDNԊNDPONN PMD~ ~DMPNNPJMMJPNPHWXIPNOKZYJPNOMSNMONPKJDPNOLKNK౓~~DPNPIXdGOKMBCDDCC[ڋNPKMeGOJPCNQPQQK@pCPNPKNfFMSMJRNORCeJONPKOfFPCNONRAgHON PKOfETNQDCQNPJNfEQNPFxCPNPJMeDQNPMUKPOONNOKSjFPNLJLGOJLIMNNOaJONLX`[QdYYbSMMSbYYdR[`XLNOJaONNMILJO?NJLNPFjRKONNOOPKCRONQDeMJPNPC[KONQEfNJPNQC@RNOREfOKPNOHgoCRNOOIJOFfOKPNOJeAQPONOQN>KOFfNKPNPCCFLOQPNKBNKOGeMKPNxTJBDM[KOGdXIPNPD~ѿKNKLONPDJKPNOMNSMONPJYZKONPIXWHPNPJMMJPNN PMD~ ~DMPNNOPDNԊNDPONNPNCIhhICNPNNQOHBCJRWWRJCBHOQNN OQPOMKKMOPQONNONNNNh8mk ]ֺ]fftt))OOiijjPP..vvee##\\\\##eevv..PPjjiiOO))ttff]ֺ]it32NNNNNNNNNNNNNNNNNNN]iyøyi]NN}}NN_ʼn_NNf˟fNNգՏNNPuuPNNtثtNNXXNNNNPPNNNNmmNNvvNNNNMMNNNMNNjvNNMNTmNNNNMNTPNNMNNNRNNMNRXNNMNOΑƖlVOVlNNTӎqXQLMMNMMLQXq՝tNNMNҊcCMNMCcPNNMNMXYMNTΈTNTʚuNNMNYZNՅ}FNF}NNMNMTUMNR̓INI֘NNMN]^NRՁMNMՏNNMNQRNOLNLfNNMNM\]MNTӦLNLˎNNMNSTNMNM֖_NNMNY[MNMNINNMNUZNMN}ŎNNMNMSUMNMNFʔNNMN^^NMNT}NNMNQRMNMNNMNM]^MNMNcNMNTTNMNCՓ]NMNMYZMNMNMqiNMNZZNMNXyNMSTMNMNQߓNM^_MNMNLƓNQRNMNMÓNM\^MNMNMӓNTUNMNlNMXYMNMNVNR݇SNMNMNR[\[RNR[b[RNMNMNSޅRNlNMNMYXMNMNMNRTNӒMNMNM^]MNÒLNMNRQNQNMNM_^MNXNMNMTSMNyqMNMNZZNMNiCNMNMZYMNMN]cNMNTTNMNNMNM^]MNMNTNMNMRQNMNN}FNMN^^NMNN}NMNMUSMNMNNŔINMNZYNMNNMNMSNM[YMNMNN_LNLӇNTSNMNN˖LNLTNM_^MNMNNfMNMONMRQMNMNN՗INIփRN^]NMNN}FNF}RNMUTMNMNNTNTʈՇNYYNMNNucCMNMCcTNMYXMNMNNP؜qXQLMMNMMLQXqՎґNMNNtƖlVOVlTNMNNONMNNXQNMNNRNMNNՇNMNNPTNMNNуNMNNmTNMNNvjNNMNNNMMNNNNvvNNmmNNNNPPNNNNXXNNtثtNNPuuPNNգՏNNf˟fNN_ʼn_NN}}NN]iyøyi]NNNNNNNNNNNNNNNNNNN   "2HjĭjH2" MM $^^$ .. fƣf CC BʫB  RR  ۷ۓ 88 DD SS  SS  5D 8  R  ӱpW66Wp Ž<  <ƝB )  )    C  ŅM M    ǘf  #$ Ɓ  Ə  ߃   .  !# †    ǖ$  ݉ ^  M   ݍ    #$ M    #ߓ$ )  Ɠ"  ܗ  <2  H  ܛ ӓj  #$     p  !$  Wē  6ܑ  ܥ  ч  * ҅ 6  ޥ ܒW  Ēp  #"      $# j  ޛ H<  2  ޗ ")   $#    M  $#  M  ލ    ^    މ $  ‡      %# .     Ɨ ǃ  $# fM M    Ň  C)  )   ʜ<  <Ǝ BӱpW66Wp   R Ň  8 D4 SS SS DD 88 ۷ۓ  RR  BʫB CC fƣf .. $^^$ MM "2HjĭjH2"   NNNNNNNNNNNNNNNNNNN]iyøyi]NN}}NN_ʼn_NNf˟fNNգՏNNPuuPNNtثtNNXXNNNNPPNNNNmmNNvvNNNNMMNNNMNNjvNNMNTmNNNNMNTPNNMNNNRNNMNRXNNMNOΑƖlVOVlNNTӎqXQLMMNMMLQXq՝tNNMNҊcCMNMCcPNNMNMXYMNTΈTNTʚuNNMNYZNՅ}FNF}NNMNMTUMNR̓INI֘NNMN]^NRՁMNMՏNNMNQRNOLNLfNNMNM\]MNTӦLNLˎNNMNSTNMNM֖_NNMNY[MNMNINNMNUZNMN}ŎNNMNMSUMNMNFʔNNMN^^NMNT}NNMNQRMNMNNMNM]^MNMNcNMNTTNMNCՓ]NMNMYZMNMNMqiNMNZZNMNXyNMSTMNMNQߓNM^_MNMNLƓNQRNMNMÓNM\^MNMNMӓNTUNMNlNMXYMNMNVNR݇SNMNMNR[\[RNR[b[RNMNMNSޅRNlNMNMYXMNMNMNRTNӒMNMNM^]MNÒLNMNRQNQNMNM_^MNXNMNMTSMNyqMNMNZZNMNiCNMNMZYMNMN]cNMNTTNMNNMNM^]MNMNTNMNMRQNMNN}FNMN^^NMNN}NMNMUSMNMNNŔINMNZYNMNNMNMSNM[YMNMNN_LNLӇNTSNMNN˖LNLTNM_^MNMNNfMNMONMRQMNMNN՗INIփRN^]NMNN}FNF}RNMUTMNMNNTNTʈՇNYYNMNNucCMNMCcTNMYXMNMNNP؜qXQLMMNMMLQXqՎґNMNNtƖlVOVlTNMNNONMNNXQNMNNRNMNNՇNMNNPTNMNNуNMNNmTNMNNvjNNMNNNMMNNNNvvNNmmNNNNPPNNNNXXNNtثtNNPuuPNNգՏNNf˟fNN_ʼn_NN}}NN]iyøyi]NNNNNNNNNNNNNNNNNNNt8mk@ 0BbͷbB0 CC:rr:BB!! ee~~ZZff  ffZZ~~ee !!BB::rrCC 00BBbbBB00 CCrr::BB!! ee~~ZZff  ffZZ~~ee !!BB:rr:CC 0BbͷbB0 onionshare-0.9.2/install/onionshare.ico000066400000000000000000000353561301215300200201750ustar00rootroot00000000000000 h6  00 %F(    N N/N NN NN NN NN NN NN N/N NN NN NN NN NL LL LN NN NN NN NN NN NN NN NSSvvSSN NN NN NN NN Nb(bb(bN NN NN N/N NSS]!]N NN NN N/N NN NvyGyM MM MX`&`^#^N NN NN NN No;oN NN NN NN NQQ¬^#^N NN NL LN NN NN NN NQQ¬_$__$_¬QQN NN NN NM ML LN NN N^#^¬QQN NN NN NN NyGyN NN NN NN N^#^`&`e,eN NN No;ovN NN NN N/N NN N]!]SSN NN N/N NN Nb(bb(bN NN NN NN NN NSSvvSSN NN NN NN NN NN NN NN NL LL LN NN NN NN NN NN N/N NN NN NN NN NN NN N/( @   N NN NSN NN NN NN NN NN NN NN NN NSN N00N N'N NN NN NN NN NN NN NN NN NN NN NN NN NN NN N'00N NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NK KIIIIK KN NN NN NN NN NN NN NN NN NN NN NN N5N NN NN NN NN NOOg/gʶʶg/gOON NN NN NN NN NN N5N NN NN NN NN NN NN Nb(bb(bN NN NN NN NN NN NN NN NN NN NN NN NkkN NN NN NN NN NN NN NN NN NN NN NxyN NN NN NN NN N00N N'N NN NN NN Nk_N NN NN NN NN NN N'N NN NN NN Nb(biM MN NN NN NN NN NN NN NN NN NN NOO˸wEwK KM ML LM Md`M Ma&a\M MN NN NN NN NN NN NSN NN NN Ng/gRRN NN NN NN NN NN NYYDzhM M[[iM MN NN NN NN NSN NN NN NN NQQN NN NN NN NN NN NN NN NL LN N`%`qM MN NN NN NN NN NN NN Nʶa)aN NN NN NN NN NN NN NN NN NN NZZhM MN NN NN NN NN NK KʶN NN NN NN NN NN NN NN NN NN N`%`rM MN NN NN NN NIIN NN NN NN NN NN NN NN NN N\ \jN NN Nj\\N NN NN NN NN NN NN NN NM MIIN NN NN NN NM Mr`%`N NN NN NN NN NN NN NN NN NK KK KN NN NN NN NN NM MhZZN NN NN NN NN NN NN NN NN NN NwEwʶN NN NN NN NN NN NN NM Mq`%`N NN NN NN NN NN NN NN NN NN NRR˸N NN NN NN NN NSN NN NN NM Mi[[M M`[M MN NN NN NN NN NN NQQg/gN NN NN NN NSN NN NN NN NN NM M\a&aM M`UUN NN NN NN Na)aOON NN NN NN NN NN NN NN NN NN NM MiĮʶb(bN NN NN NN NN N'N NN NN NN NN N`kN NN NN NN NN N'N NN NN NN NN NyxN NN NN NN NN N00N NN NN NN NN NN NkkN NN NN NN NN NN NN NN NN NN NN NN Nb(bb(bN NN NN NN NN NN NN NN N5N NN NN NN NN NOOg/gʶʶg/gOON NN NN NN NN NN N5N NN NN NN NN NN NN NN NN NN NN NK KIIIIK KN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN N'N NN NN NN NN NN NN NN NN NN NN NN NN NN NN N'N NN NSN NN NN NN NN NN NN NN NN NSN N??(0` $  N NN N-N NjN NN NN NN NN NN NN NN NN NN NN NjN N-N NN NN N"N NlN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NlN N"N NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NsN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NsN N  N N>N NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN N>N NN NFN NN NN NN NN NN NN NN NN NN NN NM MK KHHGGGGHHK KM MN NN NN NN NN NN NN NN NN NN NN NN NFN NN NrN NN NN NN NN NN NN NN NN NO OuCuxxuCuO ON NN NN NN NN NN NN NN NN NN NrN NN NrN NN NN NN NN NN NN NN N[[c˸˸c[[N NN NN NN NN NN NN NN NN NrN NN NFN NN NN NN NN NN NN NM M{K{{K{M MN NN NN NN NN NN NN NN NFN N>N NN NN NN NN NN NN N`%``%`N NN NN NN NN NN NN NN N>N NN NN NN NN NN NN NN Na'aa'aN NN NN NN NN NN NN NN NN NsN NN NN NN NN NN Na'ab)bN NN NN NN NN NN NN NsN NN NN NN NN NN NN N`%`YYN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NM MDzVVN NN NN NN NN NN NN NN NN NN NN N"N NN NN NN NN NN N{K{Dz^#^N NN NN NN NN NN NN NN NN NN NN N"N NlN NN NN NN NN N[[{J{IIK KN NL LIIN NyVVN NN Nk4kc)cN NN NN NN NN NN NN NN NlN NN NN NN NN NN NN NcQSSN NN NN NN NN NN NN NNN]"]ŰWWN NN Ns?sμZZN NN NN NN NN NN NN NN NN N-N NN NN NN NN NO O˸o:oN NN NN NN NN NN NN NN NN NN NN NK K|]"]N NN Nk5kɶYYN NN NN NN NN NN NN N-N NjN NN NN NN NN NuCuvCvN NN NN NN NN NN NN NN NN NN NN NN NN NL LL LN NN Nr?rμ`'`N NN NN NN NN NN NjN NN NN NN NN NN NxPPN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NtAtϽXXN NN NN NN NN NN NN NN NN NN NM MXXN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN Ni2iɵYYN NN NN NN NN NN NN NN NN NK KM MN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NtAtϽb(bN NN NN NN NN NN NN NN NHH}N NN NN NN NN NN NN NN NN NN NN NN NN NN NN Nr>rͻZZN NN NN NOON NM MM MFFjM MM MM MNNN NN NN NN NN NN NN NN NN NN Nm7mʷ[[N NN N[[ʷm7mN NN NN NN NN NN NN NN NN NN NNNM MM MM MFFM MM MN NOON NN NN NZZμr>rN NN NN NN NN NN NN NN NN NN NN NN NN NN NK KHHN NN NN NN NN NN NN NN Nb(bϽtAtN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NIIK KN NN NN NN NN NN NN NN NN NYYɵi2iN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN N{J{M MN NN NN NN NN NN NN NN NN NN NXXϽtAtN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NSSxN NN NN NN NN NN NN NjN NN NN NN NN N`&`νr?rN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NQuCuN NN NN NN NN NN NjN N-N NN NN NN NN NN NYYɶk5kN NN N]"]iYYN NN NN NN NN NN NN NN NN NN NN NN No:o˸O ON NN NN NN NN NN N-N NN NN NN NN NN NN NN NZZμs?sN NN NWW۬YYN NN NN NN NN NN NN NN NN NPPvCvcN NN NN NN NN NN NN NN NlN NN NN NN NN NN NN Nc)ck4kN NN NVVZK KN NN NN NN NN NM MXX[[N NN NN NN NN NN NlN N"N NN NN NN NN NN NN NN NN NN N^#^Dzufk}{K{N NN NN NN NN NN NN N"N NN NN NN NN NN NN NN NN NN NVVDzM MN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NYY`%`N NN NN NN NN NN NN NN NsN NN NN NN NN NN Nb)ba'aN NN NN NN NN NN NN NsN NN NN NN NN NN NN NN Na'aa'aN NN NN NN NN NN NN NN NN N>N NN NN NN NN NN NN N`%``%`N NN NN NN NN NN NN NN N>  N NFN NN NN NN NN NN NN NM M{K{{K{M MN NN NN NN NN NN NN NN NF  N NN NrN NN NN NN NN NN NN NN N[[c˸˸c[[N NN NN NN NN NN NN NN NN NrN NN NrN NN NN NN NN NN NN NN NN NO OuCuxxuCuO ON NN NN NN NN NN NN NN NN NN NrN NN NFN NN NN NN NN NN NN NN NN NN NN NM MK KHHGGGGHHK KM MN NN NN NN NN NN NN NN NN NN NN NN NFN N  N N>N NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN N>N NN NsN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NsN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN N"N NlN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NlN N"N NN NN N-N NjN NN NN NN NN NN NN NN NN NN NN NjN N-N N??onionshare-0.9.2/install/onionshare.nsi000066400000000000000000000245021301215300200202030ustar00rootroot00000000000000!define APPNAME "OnionShare" !define BINPATH "..\build\exe.win32-3.5" !define ABOUTURL "https:\\onionshare.org\" # change these with each release !define INSTALLSIZE 35630 !define VERSIONMAJOR 0 !define VERSIONMINOR 9 !define VERSIONSTRING "0.9.1" RequestExecutionLevel admin Name "OnionShare" InstallDir "$PROGRAMFILES\${APPNAME}" LicenseData "..\resources\license.txt" Icon "onionshare.ico" !include LogicLib.nsh Page license Page directory Page instfiles !macro VerifyUserIsAdmin UserInfo::GetAccountType pop $0 ${If} $0 != "admin" ;Require admin rights on NT4+ messageBox mb_iconstop "Administrator rights required!" setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED quit ${EndIf} !macroend # in order to code sign uninstall.exe, we need to do some hacky stuff outlined # here: http:\\nsis.sourceforge.net\Signing_an_Uninstaller !ifdef INNER !echo "Creating uninstall.exe" OutFile "$%TEMP%\tempinstaller.exe" SetCompress off !else !echo "Creating normal installer" !system "makensis.exe /DINNER onionshare.nsi" = 0 !system "$%TEMP%\tempinstaller.exe" = 2 !system "signtool.exe sign /v /d $\"Uninstall OnionShare$\" /a /tr http://timestamp.globalsign.com/scripts/timstamp.dll /fd sha256 $%TEMP%\uninstall.exe" = 0 # all done, now we can build the real installer OutFile "..\dist\OnionShare_Setup.exe" SetCompressor /FINAL /SOLID lzma !endif Function .onInit !ifdef INNER WriteUninstaller "$%TEMP%\uninstall.exe" Quit # bail out early !endif setShellVarContext all !insertmacro VerifyUserIsAdmin FunctionEnd Section "install" SetOutPath "$INSTDIR" File "onionshare.ico" SetOutPath "$INSTDIR\imageformats" File "${BINPATH}\imageformats\qdds.dll" File "${BINPATH}\imageformats\qgif.dll" File "${BINPATH}\imageformats\qicns.dll" File "${BINPATH}\imageformats\qico.dll" File "${BINPATH}\imageformats\qjpeg.dll" File "${BINPATH}\imageformats\qsvg.dll" File "${BINPATH}\imageformats\qtga.dll" File "${BINPATH}\imageformats\qtiff.dll" File "${BINPATH}\imageformats\qwbmp.dll" File "${BINPATH}\imageformats\qwebp.dll" SetOutPath "$INSTDIR\platforms" File "${BINPATH}\platforms\qminimal.dll" File "${BINPATH}\platforms\qoffscreen.dll" File "${BINPATH}\platforms\qwindows.dll" SetOutPath "$INSTDIR\resources" File "${BINPATH}\resources\license.txt" File "${BINPATH}\resources\version.txt" File "${BINPATH}\resources\wordlist.txt" SetOutPath "$INSTDIR\resources\html" File "${BINPATH}\resources\html\404.html" File "${BINPATH}\resources\html\denied.html" File "${BINPATH}\resources\html\index.html" SetOutPath "$INSTDIR\resources\images" File "${BINPATH}\resources\images\logo.png" File "${BINPATH}\resources\images\drop_files.png" File "${BINPATH}\resources\images\server_stopped.png" File "${BINPATH}\resources\images\server_started.png" File "${BINPATH}\resources\images\server_working.png" SetOutPath "$INSTDIR\resources\locale" File "${BINPATH}\resources\locale\de.json" File "${BINPATH}\resources\locale\en.json" File "${BINPATH}\resources\locale\eo.json" File "${BINPATH}\resources\locale\es.json" File "${BINPATH}\resources\locale\fi.json" File "${BINPATH}\resources\locale\fr.json" File "${BINPATH}\resources\locale\it.json" File "${BINPATH}\resources\locale\nl.json" File "${BINPATH}\resources\locale\no.json" File "${BINPATH}\resources\locale\pt.json" File "${BINPATH}\resources\locale\ru.json" File "${BINPATH}\resources\locale\tr.json" SetOutPath "$INSTDIR" File "${BINPATH}\MSVCP140.dll" File "${BINPATH}\onionshare-gui.exe" File "${BINPATH}\onionshare.exe" File "${BINPATH}\pyexpat.pyd" File "${BINPATH}\PyQt5.QtCore.pyd" File "${BINPATH}\PyQt5.QtGui.pyd" File "${BINPATH}\PyQt5.QtWidgets.pyd" File "${BINPATH}\python35.dll" File "${BINPATH}\python35.zip" File "${BINPATH}\pywintypes35.dll" File "${BINPATH}\Qt5Core.dll" File "${BINPATH}\Qt5Gui.dll" File "${BINPATH}\Qt5Svg.dll" File "${BINPATH}\Qt5Widgets.dll" File "${BINPATH}\select.pyd" File "${BINPATH}\sip.pyd" File "${BINPATH}\unicodedata.pyd" File "${BINPATH}\VCRUNTIME140.dll" File "${BINPATH}\win32wnet.pyd" File "${BINPATH}\_bz2.pyd" File "${BINPATH}\_ctypes.pyd" File "${BINPATH}\_decimal.pyd" File "${BINPATH}\_hashlib.pyd" File "${BINPATH}\_lzma.pyd" File "${BINPATH}\_multiprocessing.pyd" File "${BINPATH}\_socket.pyd" File "${BINPATH}\_ssl.pyd" # uninstaller !ifndef INNER SetOutPath $INSTDIR File $%TEMP%\uninstall.exe !endif # start menu CreateShortCut "$SMPROGRAMS\${APPNAME}.lnk" "$INSTDIR\onionshare-gui.exe" "" "$INSTDIR\onionshare.ico" # registry information for add\remove programs WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" \S" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "InstallLocation" "$\"$INSTDIR$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$\"$INSTDIR\onionshare.ico$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLInfoAbout" "$\"${ABOUTURL}$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" ${VERSIONSTRING} WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMajor" ${VERSIONMAJOR} WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMinor" ${VERSIONMINOR} # there is no option for modifying or repairing the install WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoRepair" 1 # set the INSTALLSIZE constant (!defined at the top of this script) so Add\Remove Programs can accurately report the size WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "EstimatedSize" ${INSTALLSIZE} SectionEnd # uninstaller Function un.onInit SetShellVarContext all #Verify the uninstaller - last chance to back out MessageBox MB_OKCANCEL "Uninstall ${APPNAME}?" IDOK next Abort next: !insertmacro VerifyUserIsAdmin FunctionEnd !ifdef INNER Section "uninstall" Delete "$SMPROGRAMS\${APPNAME}.lnk" # remove files Delete "$INSTDIR\imageformats\qdds.dll" Delete "$INSTDIR\imageformats\qgif.dll" Delete "$INSTDIR\imageformats\qicns.dll" Delete "$INSTDIR\imageformats\qico.dll" Delete "$INSTDIR\imageformats\qjpeg.dll" Delete "$INSTDIR\imageformats\qsvg.dll" Delete "$INSTDIR\imageformats\qtga.dll" Delete "$INSTDIR\imageformats\qtiff.dll" Delete "$INSTDIR\imageformats\qwbmp.dll" Delete "$INSTDIR\imageformats\qwebp.dll" Delete "$INSTDIR\platforms\qminimal.dll" Delete "$INSTDIR\platforms\qoffscreen.dll" Delete "$INSTDIR\platforms\qwindows.dll" Delete "$INSTDIR\resources\license.txt" Delete "$INSTDIR\resources\version.txt" Delete "$INSTDIR\resources\wordlist.txt" Delete "$INSTDIR\resources\html\404.html" Delete "$INSTDIR\resources\html\denied.html" Delete "$INSTDIR\resources\html\index.html" Delete "$INSTDIR\resources\images\logo.png" Delete "$INSTDIR\resources\images\drop_files.png" Delete "$INSTDIR\resources\images\server_stopped.png" Delete "$INSTDIR\resources\images\server_started.png" Delete "$INSTDIR\resources\images\server_working.png" Delete "$INSTDIR\resources\locale\de.json" Delete "$INSTDIR\resources\locale\en.json" Delete "$INSTDIR\resources\locale\eo.json" Delete "$INSTDIR\resources\locale\es.json" Delete "$INSTDIR\resources\locale\fi.json" Delete "$INSTDIR\resources\locale\fr.json" Delete "$INSTDIR\resources\locale\it.json" Delete "$INSTDIR\resources\locale\nl.json" Delete "$INSTDIR\resources\locale\no.json" Delete "$INSTDIR\resources\locale\pt.json" Delete "$INSTDIR\resources\locale\ru.json" Delete "$INSTDIR\resources\locale\tr.json" Delete "$INSTDIR\MSVCP140.dll" Delete "$INSTDIR\onionshare-gui.exe" Delete "$INSTDIR\onionshare.exe" Delete "$INSTDIR\pyexpat.pyd" Delete "$INSTDIR\PyQt5.QtCore.pyd" Delete "$INSTDIR\PyQt5.QtGui.pyd" Delete "$INSTDIR\PyQt5.QtWidgets.pyd" Delete "$INSTDIR\python35.dll" Delete "$INSTDIR\python35.zip" Delete "$INSTDIR\pywintypes35.dll" Delete "$INSTDIR\Qt5Core.dll" Delete "$INSTDIR\Qt5Gui.dll" Delete "$INSTDIR\Qt5Svg.dll" Delete "$INSTDIR\Qt5Widgets.dll" Delete "$INSTDIR\select.pyd" Delete "$INSTDIR\sip.pyd" Delete "$INSTDIR\unicodedata.pyd" Delete "$INSTDIR\VCRUNTIME140.dll" Delete "$INSTDIR\win32wnet.pyd" Delete "$INSTDIR\_bz2.pyd" Delete "$INSTDIR\_ctypes.pyd" Delete "$INSTDIR\_decimal.pyd" Delete "$INSTDIR\_hashlib.pyd" Delete "$INSTDIR\_lzma.pyd" Delete "$INSTDIR\_multiprocessing.pyd" Delete "$INSTDIR\_socket.pyd" Delete "$INSTDIR\_ssl.pyd" Delete "$INSTDIR\onionshare.ico" Delete "$INSTDIR\uninstall.exe" rmDir "$INSTDIR\imageformats" rmDir "$INSTDIR\platforms" rmDir "$INSTDIR\resources\html" rmDir "$INSTDIR\resources\images" rmDir "$INSTDIR\resources\locale" rmDir "$INSTDIR\resources" rmDir "$INSTDIR" # remove uninstaller information from the registry DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" SectionEnd !endif onionshare-0.9.2/install/onionshare80.xpm000066400000000000000000000371241301215300200203720ustar00rootroot00000000000000/* XPM */ static char * icon_xpm[] = { "80 80 174 2", " c None", ". c #4E0D4E", "+ c #531453", "@ c #581B58", "# c #673067", "$ c #906890", "% c #B397B3", "& c #CFBECF", "* c #E0D5E0", "= c #F0EBF0", "- c #FCFCFC", "; c #4F0E4F", "> c #6E396E", ", c #8F668F", "' c #C1AAC1", ") c #EFE9EF", "! c #FFFFFF", "~ c #865986", "{ c #C5B0C5", "] c #EAE2EA", "^ c #764476", "/ c #DFD4DF", "( c #FAF9FA", "_ c #5E235E", ": c #BDA5BD", "< c #885C88", "[ c #E8DFE8", "} c #521352", "| c #B89EB8", "1 c #FCFBFC", "2 c #5B1F5B", "3 c #4D0C4D", "4 c #571A57", "5 c #5D225D", "6 c #D8C9D8", "7 c #612761", "8 c #D4C4D4", "9 c #D4C5D4", "0 c #4E0C4E", "a c #632A63", "b c #DDD1DD", "c c #693269", "d c #DED3DE", "e c #FDFCFD", "f c #F6F3F6", "g c #D7C9D7", "h c #A482A4", "i c #7E4E7E", "j c #652D65", "k c #521252", "l c #490649", "m c #4B094B", "n c #662E66", "o c #D9CCD9", "p c #DCD0DC", "q c #A584A5", "r c #622862", "s c #440044", "t c #470447", "u c #4A084A", "v c #4C0A4C", "w c #825482", "x c #6F3A6F", "y c #4D0B4D", "z c #642B64", "A c #DBCFDB", "B c #F7F3F7", "C c #9B779B", "D c #835683", "E c #E5DBE5", "F c #E4DAE4", "G c #E8E0E8", "H c #713C71", "I c #4C0B4C", "J c #8C628C", "K c #E2D9E2", "L c #672F67", "M c #6D386D", "N c #E7DFE7", "O c #622962", "P c #926A92", "Q c #FAF8FA", "R c #E2D7E2", "S c #6C376C", "T c #4A074A", "U c #6B346B", "V c #CCBACC", "W c #875C87", "X c #F9F7F9", "Y c #7B4C7B", "Z c #DED4DE", "` c #5B1E5B", " . c #855885", ".. c #DDD2DD", "+. c #895E89", "@. c #DBCEDB", "#. c #4B084B", "$. c #7F507F", "%. c #F7F4F7", "&. c #5F245F", "*. c #764576", "=. c #551755", "-. c #FEFEFE", ";. c #D7CAD7", ">. c #5C205C", ",. c #815381", "'. c #F3EEF3", "). c #774577", "!. c #F4F0F4", "~. c #D3C3D3", "{. c #591C59", "]. c #703C70", "^. c #FEFDFE", "/. c #D3C4D3", "(. c #511051", "_. c #501150", ":. c #B093B0", "<. c #B59AB5", "[. c #FDFDFD", "}. c #B79CB7", "|. c #B599B5", "1. c #895F89", "2. c #734073", "3. c #987298", "4. c #9A759A", "5. c #8A608A", "6. c #511251", "7. c #602660", "8. c #CEBCCE", "9. c #F1ECF1", "0. c #855985", "a. c #5E225E", "b. c #784778", "c. c #DED1DE", "d. c #F3EFF3", "e. c #7F517F", "f. c #F5F1F5", "g. c #470347", "h. c #5D215D", "i. c #F3F0F3", "j. c #865B86", "k. c #450145", "l. c #D6C7D6", "m. c #F4F1F4", "n. c #805280", "o. c #E6DCE6", "p. c #885D88", "q. c #5C215C", "r. c #E6DDE6", "s. c #F8F6F8", "t. c #936C93", "u. c #460246", "v. c #DACDDA", "w. c #F6F4F6", "x. c #8E658E", "y. c #450045", "z. c #5E245E", "A. c #642C64", "B. c #DED2DE", "C. c #F7F5F7", "D. c #EEE7EE", "E. c #EDE6ED", "F. c #916991", "G. c #ECE5EC", "H. c #FBF9FB", "I. c #6A336A", "J. c #662F66", "K. c #FBFAFB", "L. c #956F95", "M. c #E9E1E9", "N. c #DACCDA", "O. c #541654", "P. c #BAA1BA", "Q. c #4E0E4E", " . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . + @ # $ % & * = - - = * & % $ # @ + . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . ; > , ' ) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ) ' , > ; . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . ~ { ] ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ] { ~ . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . ^ / ( ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ( / ^ . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . _ : ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! : _ . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . < [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! [ < . . . . . . . . . . . . . . ", " . . . . . . . . . . . . } | 1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 | } . . . . . . . . . . . . ", " . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . . ", " . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . . ", " . . . . . . . . . 3 3 4 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . ", " . . . . . . . . . . . . 5 6 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & } . . . . . . . . . . . ", " . . . . . . . . . . . . . 7 8 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! | . . . . . . . . . . . ", " . . . . . . . . . . . . . . . _ 9 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 < . . . . . . . . . . . ", " . . . . . . . 3 0 . . . . . . . a b ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! [ _ . . . . . . . . . . ", " . . . . . . . . 0 . . . . . . . . . c d ! ! ! ! ! ! ! ! ! ! e f g h i j k k j i h g f e ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! : . . . . . . . . . . . ", " . . . . . . . . . . . . . l m . . . . n o ! ! ! ! ! ! ! ! p q r s t u v . . v u t s r q p ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ^ . . . . . . . . . . ", " . . . . . . . . . . . . . 3 w x y . . . . z A ! ! ! ! ! B C 7 t v . . . . . . . . . . v t 7 C B ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! / . . . . . . . . . . . ", " . . . . . 3 0 . . . . . y D ! E 7 3 . . . . c F ! ! ! G H ; 3 . . . . . . . . . . . . . . 3 ; H G ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ( ~ . . . . . . . . . . ", " . . . . . 0 . . . . 3 I J ! ! ! K L l . . . . M E ! N O u . . . . . . . . . . . . . . . . . . u O N ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! { ; . . . . . . . . . ", " . . . . . . . . . . I P Q ! ! ! ! R S T . . . . U V O l . . . . . . . . . . . . . . . . . . . . l O G ! ! ! ! ! ! ! ! ! ! ! ! ! ! ] > . . . . . . . . . ", " . . . . 0 . . . . . v W X ! ! ! ! ! ! / j 3 . . . . + u . . . . . . . . . . . . . . . . . . . . . . u H B ! ! ! ! ! ! ! ! ! ! ! ! ! ! , . . . . . . . . . . ", " . . . 0 . . . . . v Y ! ! ! ! ! ! ! ! ! Z ` 0 . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . ; C ! ! ! ! ! ! ! ! ! ! ! ! ! ! ' + . . . . . . . . . ", " . . 0 . . . . 0 I .! ! ! ! ! ! ! ! ! ! ! ..7 u . . . . . 3 . . . . . . . . . . . . . . . . . . . . . 3 7 p ! ! ! ! ! ! ! ! ! ! ! ! ! ) @ . . . . . . . . . ", " . . . . . . . v +.B ! ! ! ! ! ! ! ! ! ! ! ! @.L #.. . . . . 3 . . . . . . . . . . . . . . . . . . . . . t q e ! ! ! ! ! ! ! ! ! ! ! ! ! # . . . . . . . . . ", ". 0 . . . . . m $.%.! ! ! ! ! ! ! ! ! ! ! ! ! ! o &.. . . . . . 3 . . . . . . . . . . . . . . . . . . . . v r f ! ! ! ! ! ! ! ! ! ! ! ! ! $ . . . . . . . . . . ", "3 . . . . . m *.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! o =.. . . . . . 3 . . . . . . . . . . . . . . . . . . . . s g ! ! ! ! ! ! ! ! ! ! ! ! ! % . . . . . . . . . . ", ". . . . . v i -.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ;.>.m . . . . 3 3 . . . . . . . . . . . . . . . . . . . t h ! ! ! ! ! ! ! ! ! ! ! ! ! & . . . . . . . . . . ", ". . . . v ,.'.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 9 r v . . . . . 3 . . . . . . . . . . . . . . . . . . u i ! ! ! ! ! ! ! ! ! ! ! ! ! * . . . . . . . . . . ", ". . . u ).!.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ~.{.. . . . . . 3 . . . . . . . . . . . . . . . . . v j ! ! ! ! ! ! ! ! ! ! ! ! ! = . . . . . . . . . . ", ". . m ].^.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! /.(.. . . . . . 3 . . . . . . . . . . . . . . . . . k ! ! ! ! ! ! ! ! ! ! ! ! ! - . . . . . . . . . . ", ". y _.:.<.<.<.<.<.<.[.! ! ! ! ! ! ! ! ! ! ! ! ! }.<.<.<.|.<.1.l . . . . . 3 . . . . 3 . . . . . m 2.3.3.3.3.3.4.! ! ! ! ! ! ! ! ! ! ! ! ! [.3.3.3.3.3.3.5.6.3 . ", ". . . . . . . . . . = ! ! ! ! ! ! ! ! ! ! ! ! ! j v . . . . . . . . . . . . . . . . 3 . . . . . y 7.8.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 9.0.#.. . ", ". . . . . . . . . . * ! ! ! ! ! ! ! ! ! ! ! ! ! i u . . . . . . . . . . . . . . . . . 3 . . . . . 3 a.8.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 9.b.m . . . ", ". . . . . . . . . . & ! ! ! ! ! ! ! ! ! ! ! ! ! h t . . . . . . . . . . . . . . . . . . 3 . . . . . 3 2 c.! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! d.e.3 . . . . ", ". . . . . . . . . . % ! ! ! ! ! ! ! ! ! ! ! ! ! g s . . . . . . . . . . . . . . . . . . . 3 . . . . . m {./ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! f.5.g.. . . . . ", ". . . . . . . . . . $ ! ! ! ! ! ! ! ! ! ! ! ! ! f r v . . . . . . . . . . . . . . . . . . . 3 . . . . . m h.8 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! i.j.k.. . . . . 0 ", " . . . . . . . . . # ! ! ! ! ! ! ! ! ! ! ! ! ! e q t . . . . . . . . . . . . . . . . . . . . 3 . . . . . y r l.! ! ! ! ! ! ! ! ! ! ! ! ! ! m.n.m . . . . . 3 ", " . . . . . . . . . @ ) ! ! ! ! ! ! ! ! ! ! ! ! ! p 7 3 . . . . . . . . . . . . . . . . . . . . 3 . . . . . y &.o.! ! ! ! ! ! ! ! ! ! ! ! %.p.y . . . . . 3 . ", " . . . . . . . . . + ' ! ! ! ! ! ! ! ! ! ! ! ! ! ! C ; . . . . . . . . . . . . . . . . . . . . . 3 . . . . . #.q.r.! ! ! ! ! ! ! ! ! ! s.t.u.. . . . . 3 . . ", " . . . . . . . . . . , ! ! ! ! ! ! ! ! ! ! ! ! ! ! B H u . . . . . . . . . . . . . . . . . . . . . 3 3 . . . . #.7 v.! ! ! ! ! ! ! ! w.x.y.. . . . . 3 . . . ", " . . . . . . . . . > ] ! ! ! ! ! ! ! ! ! ! ! ! ! ! G O l . . . . . . . . . . . . . . . . . . . . l z.A.. . . . y L B.! ! ! ! ! ! C.+.v . . . . . 3 . . . ", " . . . . . . . . . ; { ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! N O u . . . . . . . . . . . . . . . . . . u O N D.h.. . . . y O E.! ! ! ! ( F.y . . . . . 3 . . . . ", " . . . . . . . . . . ~ ( ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! G H ; 3 . . . . . . . . . . . . . . 3 ; H G ! ! D.a . . . . u 7.G.! ! H.C k.. . . . . 3 . . . . . ", " . . . . . . . . . . . / ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! B C 7 t v . . . . . . . . . . v t 7 C B ! ! ! ! R I.. . . . #.J.R K.L.y.. . . . . 3 . . . . . . ", " . . . . . . . . . . ^ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! p q r s t u v . . v u t s r q p ! ! ! ! ! ! ! * 7 . . . . y x n.y . . . . . 3 . . . . . . ", " . . . . . . . . . . . : ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! e f g h i j k k j i h g f e ! ! ! ! ! ! ! ! ! M.@ . . . . . . . . . . . 3 . . . . . . . ", " . . . . . . . . . . _ [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! G _ . . . . . . . . . 3 . . . . . . . ", " . . . . . . . . . . . < 1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! @.A.. . . . . . . 3 . . . . . . . . ", " . . . . . . . . . . . | ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! N.2 . . . . . 3 3 . . . . . . . ", " . . . . . . . . . . . } & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! F O.. . . 3 . . . . . . . . . ", " . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! P.Q.. 3 . . . . . . . . . ", " . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 0 3 . . . . . . . . . . ", " . . . . . . . . . . . . 2 & ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! & 2 . . . . . . . . . . . . ", " . . . . . . . . . . . . } | 1 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 1 | } . . . . . . . . . . . . ", " . . . . . . . . . . . . . . < [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! [ < . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . _ : ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! : _ . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . ^ / ( ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ( / ^ . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . ~ { ] ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ] { ~ . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . ; > , ' ) ! ! ! ! ! ! ! ! ! ! ! ! ! ! ) ' , > ; . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . + @ # $ % & * = - - = * & % $ # @ + . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . . . . . . . . . ", " . . . . . . . . . . . . "}; onionshare-0.9.2/install/ppa_release.sh000077500000000000000000000010711301215300200201360ustar00rootroot00000000000000#!/bin/bash # This script pushes updates to my Ubuntu PPA: https://launchpad.net/~micahflee/+archive/ppa # If you want to use it, you'll need your own ~/.dput.cf and ssh key. # More info: https://help.launchpad.net/Packaging/PPA/Uploading DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" cd $DIR VERSION=`cat resources/version.txt` rm -rf deb_dist >/dev/null 2>&1 python3 setup.py --command-packages=stdeb.command sdist_dsc cd deb_dist/onionshare-$VERSION dpkg-buildpackage -S cd .. dput ppa:micahflee/ppa onionshare_$VERSION-1_source.changes cd .. onionshare-0.9.2/install/scripts/000077500000000000000000000000001301215300200170075ustar00rootroot00000000000000onionshare-0.9.2/install/scripts/onionshare000077500000000000000000000014311301215300200211010ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 onionshare onionshare.main() onionshare-0.9.2/install/scripts/onionshare-gui000077500000000000000000000014411301215300200216640ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 onionshare_gui onionshare_gui.main() onionshare-0.9.2/install/scripts/onionshare-nautilus.py000066400000000000000000000031511301215300200233700ustar00rootroot00000000000000#!/usr/bin/env python import os import subprocess import urllib import gi gi.require_version('Nautilus', '3.0') from gi.repository import Nautilus from gi.repository import GObject # Put me in /usr/share/nautilus-python/extensions/ class OnionShareExtension(GObject.GObject, Nautilus.MenuProvider): def __init__(self): pass def url2path(self,url): file_uri = url.get_activation_uri() arg_uri = file_uri[7:] path = urllib.url2pathname(arg_uri) return path def exec_onionshare(self, filenames): # Would prefer this method but there is a conflict between GTK 2.0 vs GTK 3.0 components being loaded at once # (nautilus:3090): Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported # sys.argv = ["", "--filenames"] + filenames # sys.exit(onionshare_gui.main()) path = os.path.join(os.sep, 'usr', 'bin', 'onionshare-gui') cmd = [path, "--filenames"] + filenames subprocess.Popen(cmd) def get_file_items(self, window, files): menuitem = Nautilus.MenuItem(name='OnionShare::Nautilus', label='Share via OnionShare', tip='', icon='') menu = Nautilus.Menu() menu.append_item(menuitem) menuitem.connect("activate", self.menu_activate_cb, files) return menuitem, def menu_activate_cb(self, menu, files): file_list = [] for file in files: file_list.append(self.url2path(file)) self.exec_onionshare(file_list) onionshare-0.9.2/onionshare/000077500000000000000000000000001301215300200160175ustar00rootroot00000000000000onionshare-0.9.2/onionshare/__init__.py000066400000000000000000000013701301215300200201310ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 . """ from .onionshare import * onionshare-0.9.2/onionshare/helpers.py000066400000000000000000000152441301215300200200410ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 sys, os, inspect, hashlib, base64, platform, zipfile, tempfile, math, time from random import SystemRandom def get_platform(): """ Returns the platform OnionShare is running on. """ return platform.system() def get_resource_path(filename): """ Returns the absolute path of a resource, regardless of whether OnionShare is installed systemwide, and whether regardless of platform """ p = get_platform() if p == 'Linux' and sys.argv and sys.argv[0].startswith(sys.prefix): # OnionShare is installed systemwide in Linux resources_dir = os.path.join(sys.prefix, 'share/onionshare') elif getattr(sys, 'frozen', False): # Check if app is "frozen" with cx_Freeze # http://cx-freeze.readthedocs.io/en/latest/faq.html#using-data-files resources_dir = os.path.join(os.path.dirname(sys.executable), 'resources') else: # Look for resources directory relative to python file resources_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))), 'resources') return os.path.join(resources_dir, filename) def get_version(): """ Returns the version of OnionShare that is running. """ return open(get_resource_path('version.txt')).read().strip() def constant_time_compare(val1, val2): """ Returns True if the two strings are equal, False otherwise. The time taken is independent of the number of characters that match. For the sake of simplicity, this function executes in constant time only when the two strings have the same length. It short-circuits when they have different lengths. From: http://www.levigross.com/2014/02/07/constant-time-comparison-functions-in...-python-haskell-clojure-and-java/ """ if len(val1) != len(val2): return False result = 0 for x, y in zip(val1, val2): result |= x ^ y return result == 0 def random_string(num_bytes, output_len=None): """ Returns a random string with a specified number of bytes. """ b = os.urandom(num_bytes) h = hashlib.sha256(b).digest()[:16] s = base64.b32encode(h).lower().replace(b'=', b'').decode('utf-8') if not output_len: return s return s[:output_len] def build_slug(): """ Returns a random string made from two words from the wordlist, such as "deter-trig". """ wordlist = open(get_resource_path('wordlist.txt')).read().split('\n') wordlist.remove('') r = SystemRandom() return '-'.join(r.choice(wordlist) for x in range(2)) def human_readable_filesize(b): """ Returns filesize in a human readable format. """ thresh = 1024.0 if b < thresh: return '{0:.1f} B'.format(b) units = ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] u = 0 b /= thresh while b >= thresh: b /= thresh u += 1 return '{0:.1f} {1:s}'.format(round(b, 1), units[u]) def format_seconds(seconds): """Return a human-readable string of the format 1d2h3m4s""" seconds_in_a_minute = 60 seconds_in_an_hour = seconds_in_a_minute * 60 seconds_in_a_day = seconds_in_an_hour * 24 days = math.floor(seconds / seconds_in_a_day) hour_seconds = seconds % seconds_in_a_day hours = math.floor(hour_seconds / seconds_in_an_hour) minute_seconds = hour_seconds % seconds_in_an_hour minutes = math.floor(minute_seconds / seconds_in_a_minute) remaining_seconds = minute_seconds % seconds_in_a_minute seconds = math.ceil(remaining_seconds) human_readable = [] if days > 0: human_readable.append("{}d".format(int(days))) if hours > 0: human_readable.append("{}h".format(int(hours))) if minutes > 0: human_readable.append("{}m".format(int(minutes))) if seconds > 0: human_readable.append("{}s".format(int(seconds))) return ''.join(human_readable) def estimated_time_remaining(bytes_downloaded, total_bytes, started): now = time.time() time_elapsed = now - started # in seconds download_rate = bytes_downloaded / time_elapsed remaining_bytes = total_bytes - bytes_downloaded eta = remaining_bytes / download_rate return format_seconds(eta) def is_root(): """ Returns if user is root. """ return os.geteuid() == 0 def dir_size(start_path): """ Calculates the total size, in bytes, of all of the files in a directory. """ total_size = 0 for dirpath, dirnames, filenames in os.walk(start_path): for f in filenames: fp = os.path.join(dirpath, f) if not os.path.islink(fp): total_size += os.path.getsize(fp) return total_size class ZipWriter(object): """ ZipWriter accepts files and directories and compresses them into a zip file with. If a zip_filename is not passed in, it will use the default onionshare filename. """ def __init__(self, zip_filename=None): if zip_filename: self.zip_filename = zip_filename else: self.zip_filename = '{0:s}/onionshare_{1:s}.zip'.format(tempfile.mkdtemp(), random_string(4, 6)) self.z = zipfile.ZipFile(self.zip_filename, 'w', allowZip64=True) def add_file(self, filename): """ Add a file to the zip archive. """ self.z.write(filename, os.path.basename(filename), zipfile.ZIP_DEFLATED) def add_dir(self, filename): """ Add a directory, and all of its children, to the zip archive. """ dir_to_strip = os.path.dirname(filename.rstrip('/'))+'/' for dirpath, dirnames, filenames in os.walk(filename): for f in filenames: full_filename = os.path.join(dirpath, f) if not os.path.islink(full_filename): arc_filename = full_filename[len(dir_to_strip):] self.z.write(full_filename, arc_filename, zipfile.ZIP_DEFLATED) def close(self): """ Close the zip archive. """ self.z.close() onionshare-0.9.2/onionshare/onion.py000066400000000000000000000225461301215300200175240ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 . """ from stem.control import Controller from stem import SocketError import os, sys, tempfile, shutil, urllib from . import socks from . import helpers, strings class NoTor(Exception): """ This exception is raised if onionshare can't find a Tor control port to connect to, or if it can't find a Tor socks5 proxy to proxy though. """ pass class Onion(object): """ Onion is an abstraction layer for connecting to the Tor control port and creating onion services. OnionShare supports creating onion services using two methods: - Modifying the Tor configuration through the control port is the old method, and will be deprecated in favor of ephemeral onion services. - Using the control port to create ephemeral onion servers is the preferred method. This class detects the versions of Tor and stem to determine if ephemeral onion services are supported. If not, it falls back to modifying the Tor configuration. """ def __init__(self, transparent_torification=False): self.transparent_torification = transparent_torification # files and dirs to delete on shutdown self.cleanup_filenames = [] self.service_id = None # connect to the tor controlport found_tor = False self.c = None env_port = os.environ.get('TOR_CONTROL_PORT') if env_port: ports = [int(env_port)] else: ports = [9151, 9153, 9051] for port in ports: try: self.c = Controller.from_port(port=port) self.c.authenticate() found_tor = True break except SocketError: pass if not found_tor: raise NoTor(strings._("cant_connect_ctrlport").format(str(ports))) # do the versions of stem and tor that I'm using support ephemeral onion services? tor_version = self.c.get_version().version_str list_ephemeral_hidden_services = getattr(self.c, "list_ephemeral_hidden_services", None) self.supports_ephemeral = callable(list_ephemeral_hidden_services) and tor_version >= '0.2.7.1' def start(self, port): """ Start a onion service on port 80, pointing to the given port, and return the onion hostname. """ print(strings._("connecting_ctrlport").format(int(port))) if self.supports_ephemeral: print(strings._('using_ephemeral')) res = self.c.create_ephemeral_hidden_service({ 80: port }, await_publication = True) self.service_id = res.content()[0][2].split('=')[1] onion_host = self.service_id + '.onion' return onion_host else: # come up with a onion service directory name if helpers.get_platform() == 'Windows': self.hidserv_dir = tempfile.mkdtemp() self.hidserv_dir = self.hidserv_dir.replace('\\', '/') else: self.hidserv_dir = tempfile.mkdtemp(suffix='onionshare',dir='/tmp') self.cleanup_filenames.append(self.hidserv_dir) # set up onion service hsdic = self.c.get_conf_map('HiddenServiceOptions') or { 'HiddenServiceDir': [], 'HiddenServicePort': [] } if self.hidserv_dir in hsdic.get('HiddenServiceDir', []): # Maybe a stale service with the wrong local port dropme = hsdic['HiddenServiceDir'].index(self.hidserv_dir) del hsdic['HiddenServiceDir'][dropme] del hsdic['HiddenServicePort'][dropme] hsdic['HiddenServiceDir'] = hsdic.get('HiddenServiceDir', [])+[self.hidserv_dir] hsdic['HiddenServicePort'] = hsdic.get('HiddenServicePort', [])+[ '80 127.0.0.1:{0:d}'.format(port)] self.c.set_options(self._hsdic2list(hsdic)) # figure out the .onion hostname hostname_file = '{0:s}/hostname'.format(self.hidserv_dir) onion_host = open(hostname_file, 'r').read().strip() return onion_host def wait_for_hs(self, onion_host): """ This function is only required when using non-ephemeral onion services. After creating a onion service, continually attempt to connect to it until it successfully connects. """ # legacy only, this function is no longer required with ephemeral onion services print(strings._('wait_for_hs')) ready = False while not ready: try: sys.stdout.write('{0:s} '.format(strings._('wait_for_hs_trying'))) sys.stdout.flush() if self.transparent_torification: # no need to set the socks5 proxy urllib.request.urlopen('http://{0:s}'.format(onion_host)) else: tor_exists = False ports = [9150, 9152, 9050] for port in ports: try: s = socks.socksocket() s.setproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', port) s.connect((onion_host, 80)) s.close() tor_exists = True break except socks.ProxyConnectionError: pass if not tor_exists: raise NoTor(strings._("cant_connect_socksport").format(str(ports))) ready = True sys.stdout.write('{0:s}\n'.format(strings._('wait_for_hs_yup'))) except socks.GeneralProxyError: sys.stdout.write('{0:s}\n'.format(strings._('wait_for_hs_nope'))) sys.stdout.flush() except socks.SOCKS5Error: sys.stdout.write('{0:s}\n'.format(strings._('wait_for_hs_nope'))) sys.stdout.flush() except urllib.error.HTTPError: # torification error sys.stdout.write('{0:s}\n'.format(strings._('wait_for_hs_nope'))) sys.stdout.flush() except KeyboardInterrupt: return False return True def cleanup(self): """ Stop onion services that were created earlier, and delete any temporary files that were created. """ if self.supports_ephemeral: # cleanup the ephemeral onion service if self.service_id: self.c.remove_ephemeral_hidden_service(self.service_id) self.service_id = None else: # cleanup onion service try: if self.controller: # Get fresh onion services (maybe changed since last time) # and remove ourselves hsdic = self.controller.get_conf_map('HiddenServiceOptions') or { 'HiddenServiceDir': [], 'HiddenServicePort': [] } if self.hidserv_dir and self.hidserv_dir in hsdic.get('HiddenServiceDir', []): dropme = hsdic['HiddenServiceDir'].index(self.hidserv_dir) del hsdic['HiddenServiceDir'][dropme] del hsdic['HiddenServicePort'][dropme] self.controller.set_options(self._hsdic2list(hsdic)) # Politely close the controller self.controller.close() except: pass # cleanup files for filename in self.cleanup_filenames: if os.path.isfile(filename): os.remove(filename) elif os.path.isdir(filename): shutil.rmtree(filename) self.cleanup_filenames = [] def _hsdic2list(self, dic): """ Convert what we get from get_conf_map to what we need for set_options. For example, if input looks like this: { 'HiddenServicePort': [ '80 127.0.0.1:47906', '80 127.0.0.1:33302' ], 'HiddenServiceDir': [ '/tmp/onionsharelTfZZu', '/tmp/onionsharechDai3' ] } Output will look like this: [ ('HiddenServiceDir', '/tmp/onionsharelTfZZu'), ('HiddenServicePort', '80 127.0.0.1:47906'), ('HiddenServiceDir', '/tmp/onionsharechDai3'), ('HiddenServicePort', '80 127.0.0.1:33302') ] """ l = [] for dir, port in zip(dic['HiddenServiceDir'], dic['HiddenServicePort']): l.append(('HiddenServiceDir', dir)) l.append(('HiddenServicePort', port)) return l onionshare-0.9.2/onionshare/onionshare.py000066400000000000000000000140431301215300200205400ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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, sys, time, argparse, shutil, socket, threading from . import strings, helpers, web, onion class OnionShare(object): """ OnionShare is the main application class. Pass in options and run start_onion_service and it will do the magic. """ def __init__(self, debug=False, local_only=False, stay_open=False, transparent_torification=False): self.port = None self.onion = None self.hidserv_dir = None self.onion_host = None # files and dirs to delete on shutdown self.cleanup_filenames = [] # debug mode if debug: web.debug_mode() # do not use tor -- for development self.local_only = local_only # automatically close when download is finished self.stay_open = stay_open # traffic automatically goes through Tor self.transparent_torification = transparent_torification def choose_port(self): """ Pick an un-used port in the range 17600-17650 to bind to. """ # let the OS choose a port tmpsock = socket.socket() for port in range(17600, 17650): try: tmpsock.bind(("127.0.0.1", port)) break except OSError: pass self.port = tmpsock.getsockname()[1] tmpsock.close() def start_onion_service(self): """ Start the onionshare onion service. """ if not self.port: self.choose_port() if self.local_only: self.onion_host = '127.0.0.1:{0:d}'.format(self.port) return if not self.onion: self.onion = onion.Onion(self.transparent_torification) self.onion_host = self.onion.start(self.port) def cleanup(self): """ Shut everything down and clean up temporary files, etc. """ # cleanup files for filename in self.cleanup_filenames: if os.path.isfile(filename): os.remove(filename) elif os.path.isdir(filename): shutil.rmtree(filename) self.cleanup_filenames = [] # cleanup the onion if self.onion: self.onion.cleanup() def main(cwd=None): """ The main() function implements all of the logic that the command-line version of onionshare uses. """ strings.load_strings(helpers) print(strings._('version_string').format(helpers.get_version())) # onionshare CLI in OSX needs to change current working directory (#132) if helpers.get_platform() == 'Darwin': if cwd: os.chdir(cwd) # parse arguments parser = argparse.ArgumentParser() parser.add_argument('--local-only', action='store_true', dest='local_only', help=strings._("help_local_only")) parser.add_argument('--stay-open', action='store_true', dest='stay_open', help=strings._("help_stay_open")) parser.add_argument('--transparent', action='store_true', dest='transparent_torification', help=strings._("help_transparent_torification")) parser.add_argument('--debug', action='store_true', dest='debug', help=strings._("help_debug")) parser.add_argument('filename', metavar='filename', nargs='+', help=strings._('help_filename')) args = parser.parse_args() filenames = args.filename for i in range(len(filenames)): filenames[i] = os.path.abspath(filenames[i]) local_only = bool(args.local_only) debug = bool(args.debug) stay_open = bool(args.stay_open) transparent_torification = bool(args.transparent_torification) # validation valid = True for filename in filenames: if not os.path.exists(filename): print(strings._("not_a_file").format(filename)) valid = False if not valid: sys.exit() # start the onionshare app try: app = OnionShare(debug, local_only, stay_open, transparent_torification) app.choose_port() app.start_onion_service() except onion.NoTor as e: sys.exit(e.args[0]) # prepare files to share print(strings._("preparing_files")) web.set_file_info(filenames) app.cleanup_filenames.append(web.zip_filename) # warn about sending large files over Tor if web.zip_filesize >= 157286400: # 150mb print('') print(strings._("large_filesize")) print('') # start onionshare http service in new thread t = threading.Thread(target=web.start, args=(app.port, app.stay_open, app.transparent_torification)) t.daemon = True t.start() try: # Trap Ctrl-C # wait for hs, only if using old version of tor if not app.local_only and not app.onion.supports_ephemeral: ready = app.onion.wait_for_hs(app.onion_host) if not ready: sys.exit() else: # Wait for web.generate_slug() to finish running time.sleep(0.2) print(strings._("give_this_url")) print('http://{0:s}/{1:s}'.format(app.onion_host, web.slug)) print('') print(strings._("ctrlc_to_stop")) # wait for app to close while t.is_alive(): # t.join() can't catch KeyboardInterrupt in such as Ubuntu t.join(0.5) except KeyboardInterrupt: web.stop(app.port) finally: # shutdown app.cleanup() if __name__ == '__main__': main() onionshare-0.9.2/onionshare/socks.py000066400000000000000000000473441301215300200175270ustar00rootroot00000000000000""" SocksiPy - Python SOCKS module. Version 1.5.0 Copyright 2006 Dan-Haim. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. Neither the name of Dan Haim nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY DAN HAIM "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 DAN HAIM OR HIS 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, 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 provides a standard socket-like interface for Python for tunneling connections through SOCKS proxies. =============================================================================== Minor modifications made by Christopher Gilbert (http://motomastyle.com/) for use in PyLoris (http://pyloris.sourceforge.net/) Minor modifications made by Mario Vilas (http://breakingcode.wordpress.com/) mainly to merge bug fixes found in Sourceforge Modifications made by Anorov (https://github.com/Anorov) -Forked and renamed to PySocks -Fixed issue with HTTP proxy failure checking (same bug that was in the old ___recvall() method) -Included SocksiPyHandler (sockshandler.py), to be used as a urllib2 handler, courtesy of e000 (https://github.com/e000): https://gist.github.com/869791#file_socksipyhandler.py -Re-styled code to make it readable -Aliased PROXY_TYPE_SOCKS5 -> SOCKS5 etc. -Improved exception handling and output -Removed irritating use of sequence indexes, replaced with tuple unpacked variables -Fixed up Python 3 bytestring handling - chr(0x03).encode() -> b"\x03" -Other general fixes -Added clarification that the HTTP proxy connection method only supports CONNECT-style tunneling HTTP proxies -Various small bug fixes """ __version__ = "1.5.0" import socket import struct PROXY_TYPE_SOCKS4 = SOCKS4 = 1 PROXY_TYPE_SOCKS5 = SOCKS5 = 2 PROXY_TYPE_HTTP = HTTP = 3 PRINTABLE_PROXY_TYPES = {SOCKS4: "SOCKS4", SOCKS5: "SOCKS5", HTTP: "HTTP"} _orgsocket = _orig_socket = socket.socket class ProxyError(IOError): """ socket_err contains original socket.error exception. """ def __init__(self, msg, socket_err=None): self.msg = msg self.socket_err = socket_err if socket_err: self.msg = msg + ": {}".format(socket_err) def __str__(self): return self.msg class GeneralProxyError(ProxyError): pass class ProxyConnectionError(ProxyError): pass class SOCKS5AuthError(ProxyError): pass class SOCKS5Error(ProxyError): pass class SOCKS4Error(ProxyError): pass class HTTPError(ProxyError): pass SOCKS4_ERRORS = { 0x5B: "Request rejected or failed", 0x5C: "Request rejected because SOCKS server cannot connect to identd on the client", 0x5D: "Request rejected because the client program and identd report different user-ids", } SOCKS5_ERRORS = { 0x01: "General SOCKS server failure", 0x02: "Connection not allowed by ruleset", 0x03: "Network unreachable", 0x04: "Host unreachable", 0x05: "Connection refused", 0x06: "TTL expired", 0x07: "Command not supported, or protocol error", 0x08: "Address type not supported", } DEFAULT_PORTS = { SOCKS4: 1080, SOCKS5: 1080, HTTP: 8080, } def set_default_proxy(proxy_type=None, addr=None, port=None, rdns=True, username=None, password=None): """ set_default_proxy(proxy_type, addr[, port[, rdns[, username, password]]]) Sets a default proxy which all further socksocket objects will use, unless explicitly changed. """ socksocket.default_proxy = (proxy_type, addr.encode(), port, rdns, username.encode() if username else None, password.encode() if password else None) setdefaultproxy = set_default_proxy def get_default_proxy(): """ Returns the default proxy, set by set_default_proxy. """ return socksocket.default_proxy getdefaultproxy = get_default_proxy def wrap_module(module): """ Attempts to replace a module's socket library with a SOCKS socket. Must set a default proxy using set_default_proxy(...) first. This will only work on modules that import socket directly into the namespace; most of the Python Standard Library falls into this category. """ if socksocket.default_proxy: module.socket.socket = socksocket else: raise GeneralProxyError("No default proxy specified") wrapmodule = wrap_module def create_connection(dest_pair, proxy_type=None, proxy_addr=None, proxy_port=None, proxy_username=None, proxy_password=None, timeout=None): """create_connection(dest_pair, **proxy_args) -> socket object Like socket.create_connection(), but connects to proxy before returning the socket object. dest_pair - 2-tuple of (IP/hostname, port). **proxy_args - Same args passed to socksocket.set_proxy(). timeout - Optional socket timeout value, in seconds. """ sock = socksocket() if isinstance(timeout, (int, float)): sock.settimeout(timeout) sock.set_proxy(proxy_type, proxy_addr, proxy_port, proxy_username, proxy_password) sock.connect(dest_pair) return sock class socksocket(socket.socket): """socksocket([family[, type[, proto]]]) -> socket object Open a SOCKS enabled socket. The parameters are the same as those of the standard socket init. In order for SOCKS to work, you must specify family=AF_INET, type=SOCK_STREAM and proto=0. """ default_proxy = None def __init__(self, family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0, _sock=None): _orig_socket.__init__(self, family, type, proto, _sock) if self.default_proxy: self.proxy = self.default_proxy else: self.proxy = (None, None, None, None, None, None) self.proxy_sockname = None self.proxy_peername = None self.proxy_negotiators = { SOCKS4: self._negotiate_SOCKS4, SOCKS5: self._negotiate_SOCKS5, HTTP: self._negotiate_HTTP, } def _recvall(self, count): """ Receive EXACTLY the number of bytes requested from the socket. Blocks until the required number of bytes have been received. """ data = b"" while len(data) < count: d = self.recv(count - len(data)) if not d: raise GeneralProxyError("Connection closed unexpectedly") data += d return data def set_proxy(self, proxy_type=None, addr=None, port=None, rdns=True, username=None, password=None): """set_proxy(proxy_type, addr[, port[, rdns[, username[, password]]]]) Sets the proxy to be used. proxy_type - The type of the proxy to be used. Three types are supported: PROXY_TYPE_SOCKS4 (including socks4a), PROXY_TYPE_SOCKS5 and PROXY_TYPE_HTTP addr - The address of the server (IP or DNS). port - The port of the server. Defaults to 1080 for SOCKS servers and 8080 for HTTP proxy servers. rdns - Should DNS queries be performed on the remote side (rather than the local side). The default is True. Note: This has no effect with SOCKS4 servers. username - Username to authenticate with to the server. The default is no authentication. password - Password to authenticate with to the server. Only relevant when username is also provided. """ self.proxy = (proxy_type, addr.encode(), port, rdns, username.encode() if username else None, password.encode() if password else None) setproxy = set_proxy def get_proxy_sockname(self): """ Returns the bound IP address and port number at the proxy. """ return self.proxy_sockname getproxysockname = get_proxy_sockname def get_proxy_peername(self): """ Returns the IP and port number of the proxy. """ return _orig_socket.getpeername(self) getproxypeername = get_proxy_peername def get_peername(self): """ Returns the IP address and port number of the destination machine (note: get_proxy_peername returns the proxy) """ return self.proxy_peername getpeername = get_peername def _negotiate_SOCKS5(self, dest_addr, dest_port): """ Negotiates a connection through a SOCKS5 server. """ proxy_type, addr, port, rdns, username, password = self.proxy # First we'll send the authentication packages we support. if username and password: # The username/password details were supplied to the # set_proxy method so we support the USERNAME/PASSWORD # authentication (in addition to the standard none). self.sendall(b"\x05\x02\x00\x02") else: # No username/password were entered, therefore we # only support connections with no authentication. self.sendall(b"\x05\x01\x00") # We'll receive the server's response to determine which # method was selected chosen_auth = self._recvall(2) if chosen_auth[0:1] != b"\x05": # Note: string[i:i+1] is used because indexing of a bytestring # via bytestring[i] yields an integer in Python 3 raise GeneralProxyError("SOCKS5 proxy server sent invalid data") # Check the chosen authentication method if chosen_auth[1:2] == b"\x02": # Okay, we need to perform a basic username/password # authentication. self.sendall(b"\x01" + chr(len(username)).encode() + username + chr(len(password)).encode() + password) auth_status = self._recvall(2) if auth_status[0:1] != b"\x01": # Bad response raise GeneralProxyError("SOCKS5 proxy server sent invalid data") if auth_status[1:2] != b"\x00": # Authentication failed raise SOCKS5AuthError("SOCKS5 authentication failed") # Otherwise, authentication succeeded # No authentication is required if 0x00 elif chosen_auth[1:2] != b"\x00": # Reaching here is always bad if chosen_auth[1:2] == b"\xFF": raise SOCKS5AuthError("All offered SOCKS5 authentication methods were rejected") else: raise GeneralProxyError("SOCKS5 proxy server sent invalid data") # Now we can request the actual connection req = b"\x05\x01\x00" # If the given destination address is an IP address, we'll # use the IPv4 address request even if remote resolving was specified. try: addr_bytes = socket.inet_aton(dest_addr) req += b"\x01" + addr_bytes except socket.error: # Well it's not an IP number, so it's probably a DNS name. if rdns: # Resolve remotely addr_bytes = None req += b"\x03" + chr(len(dest_addr)).encode() + dest_addr.encode() else: # Resolve locally addr_bytes = socket.inet_aton(socket.gethostbyname(dest_addr)) req += b"\x01" + addr_bytes req += struct.pack(">H", dest_port) self.sendall(req) # Get the response resp = self._recvall(4) if resp[0:1] != b"\x05": raise GeneralProxyError("SOCKS5 proxy server sent invalid data") status = ord(resp[1:2]) if status != 0x00: # Connection failed: server returned an error error = SOCKS5_ERRORS.get(status, "Unknown error") raise SOCKS5Error("{:#04x}: {}".format(status, error)) # Get the bound address/port if resp[3:4] == b"\x01": bound_addr = self._recvall(4) elif resp[3:4] == b"\x03": resp += self.recv(1) bound_addr = self._recvall(ord(resp[4:5])) else: raise GeneralProxyError("SOCKS5 proxy server sent invalid data") bound_port = struct.unpack(">H", self._recvall(2))[0] self.proxy_sockname = bound_addr, bound_port if addr_bytes: self.proxy_peername = socket.inet_ntoa(addr_bytes), dest_port else: self.proxy_peername = dest_addr, dest_port def _negotiate_SOCKS4(self, dest_addr, dest_port): """ Negotiates a connection through a SOCKS4 server. """ proxy_type, addr, port, rdns, username, password = self.proxy # Check if the destination address provided is an IP address remote_resolve = False try: addr_bytes = socket.inet_aton(dest_addr) except socket.error: # It's a DNS name. Check where it should be resolved. if rdns: addr_bytes = b"\x00\x00\x00\x01" remote_resolve = True else: addr_bytes = socket.inet_aton(socket.gethostbyname(dest_addr)) # Construct the request packet req = struct.pack(">BBH", 0x04, 0x01, dest_port) + addr_bytes # The username parameter is considered userid for SOCKS4 if username: req += username req += b"\x00" # DNS name if remote resolving is required # NOTE: This is actually an extension to the SOCKS4 protocol # called SOCKS4A and may not be supported in all cases. if remote_resolve: req += dest_addr.encode() + b"\x00" self.sendall(req) # Get the response from the server resp = self._recvall(8) if resp[0:1] != b"\x00": # Bad data raise GeneralProxyError("SOCKS4 proxy server sent invalid data") status = ord(resp[1:2]) if status != 0x5A: # Connection failed: server returned an error error = SOCKS4_ERRORS.get(status, "Unknown error") raise SOCKS4Error("{:#04x}: {}".format(status, error)) # Get the bound address/port self.proxy_sockname = (socket.inet_ntoa(resp[4:]), struct.unpack(">H", resp[2:4])[0]) if remote_resolve: self.proxy_peername = socket.inet_ntoa(addr_bytes), dest_port else: self.proxy_peername = dest_addr, dest_port def _negotiate_HTTP(self, dest_addr, dest_port): """ Negotiates a connection through an HTTP server. NOTE: This currently only supports HTTP CONNECT-style proxies. """ proxy_type, addr, port, rdns, username, password = self.proxy # If we need to resolve locally, we do this now addr = dest_addr if rdns else socket.gethostbyname(dest_addr) self.sendall(b"CONNECT " + addr.encode() + b":" + str(dest_port).encode() + b" HTTP/1.1\r\n" + b"Host: " + dest_addr.encode() + b"\r\n\r\n") # We just need the first line to check if the connection was successful fobj = self.makefile() status_line = fobj.readline() fobj.close() if not status_line: raise GeneralProxyError("Connection closed unexpectedly") try: proto, status_code, status_msg = status_line.split(" ", 2) except ValueError: raise GeneralProxyError("HTTP proxy server sent invalid response") if not proto.startswith("HTTP/"): raise GeneralProxyError("Proxy server does not appear to be an HTTP proxy") try: status_code = int(status_code) except ValueError: raise HTTPError("HTTP proxy server did not return a valid HTTP status") if status_code != 200: error = "{}: {}".format(status_code, status_msg) if status_code in (400, 403, 405): # It's likely that the HTTP proxy server does not support the CONNECT tunneling method error += ("\n[*] Note: The HTTP proxy server may not be supported by PySocks" " (must be a CONNECT tunnel proxy)") raise HTTPError(error) self.proxy_sockname = (b"0.0.0.0", 0) self.proxy_peername = addr, dest_port def connect(self, dest_pair): """ Connects to the specified destination through a proxy. Uses the same API as socket's connect(). To select the proxy server, use set_proxy(). dest_pair - 2-tuple of (IP/hostname, port). """ proxy_type, proxy_addr, proxy_port, rdns, username, password = self.proxy dest_addr, dest_port = dest_pair # Do a minimal input check first if (not isinstance(dest_pair, (list, tuple)) or len(dest_pair) != 2 or not isinstance(dest_addr, type("")) or not isinstance(dest_port, int)): raise GeneralProxyError("Invalid destination-connection (host, port) pair") if proxy_type is None: # Treat like regular socket object _orig_socket.connect(self, (dest_addr, dest_port)) return proxy_port = proxy_port or DEFAULT_PORTS.get(proxy_type) if not proxy_port: raise GeneralProxyError("Invalid proxy type") try: # Initial connection to proxy server _orig_socket.connect(self, (proxy_addr, proxy_port)) except socket.error as error: # Error while connecting to proxy self.close() proxy_server = "{}:{}".format(proxy_addr.decode(), proxy_port) printable_type = PRINTABLE_PROXY_TYPES[proxy_type] msg = "Error connecting to {} proxy {}".format(printable_type, proxy_server) raise ProxyConnectionError(msg, error) else: # Connected to proxy server, now negotiate try: # Calls negotiate_{SOCKS4, SOCKS5, HTTP} self.proxy_negotiators[proxy_type](dest_addr, dest_port) except socket.error as error: # Wrap socket errors self.close() raise GeneralProxyError("Socket error", error) except ProxyError: # Protocol error while negotiating with proxy self.close() raise onionshare-0.9.2/onionshare/strings.py000066400000000000000000000035401301215300200200640ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 json, locale, os strings = {} def load_strings(helpers, default="en"): """ Loads translated strings and fallback to English if the translation does not exist. """ global strings p = helpers.get_platform() # find locale dir locale_dir = helpers.get_resource_path('locale') # load all translations translations = {} for filename in os.listdir(locale_dir): abs_filename = os.path.join(locale_dir, filename) lang, ext = os.path.splitext(filename) if abs_filename.endswith('.json'): lang_json = open(abs_filename, encoding='utf-8').read() translations[lang] = json.loads(lang_json) strings = translations[default] lc, enc = locale.getdefaultlocale() if lc: lang = lc[:2] if lang in translations: # if a string doesn't exist, fallback to English for key in translations[default]: if key in translations[lang]: strings[key] = translations[lang][key] def translated(k, gui=False): """ Returns a translated string. """ return strings[k] _ = translated onionshare-0.9.2/onionshare/web.py000066400000000000000000000261741301215300200171600ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 queue, mimetypes, platform, os, sys, socket, logging from urllib.request import urlopen from flask import Flask, Response, request, render_template_string, abort from . import strings, helpers app = Flask(__name__) # information about the file file_info = [] zip_filename = None zip_filesize = None def set_file_info(filenames): """ Using the list of filenames being shared, fill in details that the web page will need to display. This includes zipping up the file in order to get the zip file's name and size. """ global file_info, zip_filename, zip_filesize # build file info list file_info = {'files': [], 'dirs': []} for filename in filenames: info = { 'filename': filename, 'basename': os.path.basename(filename.rstrip('/')) } if os.path.isfile(filename): info['size'] = os.path.getsize(filename) info['size_human'] = helpers.human_readable_filesize(info['size']) file_info['files'].append(info) if os.path.isdir(filename): info['size'] = helpers.dir_size(filename) info['size_human'] = helpers.human_readable_filesize(info['size']) file_info['dirs'].append(info) file_info['files'] = sorted(file_info['files'], key=lambda k: k['basename']) file_info['dirs'] = sorted(file_info['dirs'], key=lambda k: k['basename']) # zip up the files and folders z = helpers.ZipWriter() for info in file_info['files']: z.add_file(info['filename']) for info in file_info['dirs']: z.add_dir(info['filename']) z.close() zip_filename = z.zip_filename zip_filesize = os.path.getsize(zip_filename) REQUEST_LOAD = 0 REQUEST_DOWNLOAD = 1 REQUEST_PROGRESS = 2 REQUEST_OTHER = 3 REQUEST_CANCELED = 4 REQUEST_RATE_LIMIT = 5 q = queue.Queue() def add_request(request_type, path, data=None): """ Add a request to the queue, to communicate with the GUI. """ global q q.put({ 'type': request_type, 'path': path, 'data': data }) slug = None def generate_slug(): global slug slug = helpers.build_slug() download_count = 0 error404_count = 0 stay_open = False def set_stay_open(new_stay_open): """ Set stay_open variable. """ global stay_open stay_open = new_stay_open def get_stay_open(): """ Get stay_open variable. """ return stay_open transparent_torification = False def set_transparent_torification(new_transparent_torification): """ Set transparent_torification variable. """ global transparent_torification stay_open = new_transparent_torification def get_transparent_torification(): """ Get transparent_torification variable." """ return transparent_torification # Are we running in GUI mode? gui_mode = False def set_gui_mode(): """ Tell the web service that we're running in GUI mode """ global gui_mode gui_mode = True def debug_mode(): """ Turn on debugging mode, which will log flask errors to a debug file. """ if platform.system() == 'Windows': temp_dir = os.environ['Temp'].replace('\\', '/') else: temp_dir = '/tmp/' log_handler = logging.FileHandler('{0:s}/onionshare_server.log'.format(temp_dir)) log_handler.setLevel(logging.WARNING) app.logger.addHandler(log_handler) def check_slug_candidate(slug_candidate, slug_compare = None): global slug if not slug_compare: slug_compare = slug if not helpers.constant_time_compare(slug_compare.encode('ascii'), slug_candidate.encode('ascii')): abort(404) # If "Stop sharing automatically" is checked (stay_open == False), only allow # one download at a time. download_in_progress = False @app.route("/") def index(slug_candidate): """ Render the template for the onionshare landing page. """ check_slug_candidate(slug_candidate) add_request(REQUEST_LOAD, request.path) # Deny new downloads if "Stop sharing automatically" is checked and there is # currently a download global stay_open, download_in_progress deny_download = not stay_open and download_in_progress if deny_download: return render_template_string(open(helpers.get_resource_path('html/denied.html')).read()) # If download is allowed to continue, serve download page return render_template_string( open(helpers.get_resource_path('html/index.html')).read(), slug=slug, file_info=file_info, filename=os.path.basename(zip_filename), filesize=zip_filesize, filesize_human=helpers.human_readable_filesize(zip_filesize)) # If the client closes the OnionShare window while a download is in progress, # it should immediately stop serving the file. The client_cancel global is # used to tell the download function that the client is canceling the download. client_cancel = False @app.route("//download") def download(slug_candidate): """ Download the zip file. """ check_slug_candidate(slug_candidate) # Deny new downloads if "Stop sharing automatically" is checked and there is # currently a download global stay_open, download_in_progress deny_download = not stay_open and download_in_progress if deny_download: return render_template_string(open(helpers.get_resource_path('html/denied.html')).read()) global download_count # each download has a unique id download_id = download_count download_count += 1 # prepare some variables to use inside generate() function below # which is outside of the request context shutdown_func = request.environ.get('werkzeug.server.shutdown') path = request.path # tell GUI the download started add_request(REQUEST_DOWNLOAD, path, {'id': download_id}) dirname = os.path.dirname(zip_filename) basename = os.path.basename(zip_filename) def generate(): # The user hasn't canceled the download global client_cancel, gui_mode client_cancel = False # Starting a new download global stay_open, download_in_progress if not stay_open: download_in_progress = True chunk_size = 102400 # 100kb fp = open(zip_filename, 'rb') done = False canceled = False while not done: # The user has canceled the download, so stop serving the file if client_cancel: add_request(REQUEST_CANCELED, path, {'id': download_id}) break chunk = fp.read(chunk_size) if chunk == b'': done = True else: try: yield chunk # tell GUI the progress downloaded_bytes = fp.tell() percent = (1.0 * downloaded_bytes / zip_filesize) * 100 # only output to stdout if running onionshare in CLI mode, or if using Linux (#203, #304) if not gui_mode or helpers.get_platform() == 'Linux': sys.stdout.write( "\r{0:s}, {1:.2f}% ".format(helpers.human_readable_filesize(downloaded_bytes), percent)) sys.stdout.flush() add_request(REQUEST_PROGRESS, path, {'id': download_id, 'bytes': downloaded_bytes}) except: # looks like the download was canceled done = True canceled = True # tell the GUI the download has canceled add_request(REQUEST_CANCELED, path, {'id': download_id}) fp.close() if helpers.get_platform() != 'Darwin': sys.stdout.write("\n") # Download is finished if not stay_open: download_in_progress = False # Close the server, if necessary if not stay_open and not canceled: print(strings._("closing_automatically")) if shutdown_func is None: raise RuntimeError('Not running with the Werkzeug Server') shutdown_func() r = Response(generate()) r.headers.add('Content-Length', zip_filesize) r.headers.add('Content-Disposition', 'attachment', filename=basename) # guess content type (content_type, _) = mimetypes.guess_type(basename, strict=False) if content_type is not None: r.headers.add('Content-Type', content_type) return r @app.errorhandler(404) def page_not_found(e): """ 404 error page. """ add_request(REQUEST_OTHER, request.path) global error404_count if request.path != '/favicon.ico': error404_count += 1 if error404_count == 20: add_request(REQUEST_RATE_LIMIT, request.path) force_shutdown() print(strings._('error_rate_limit')) return render_template_string(open(helpers.get_resource_path('html/404.html')).read()) # shutting down the server only works within the context of flask, so the easiest way to do it is over http shutdown_slug = helpers.random_string(16) @app.route("//shutdown") def shutdown(slug_candidate): """ Stop the flask web server, from the context of an http request. """ check_slug_candidate(slug_candidate, shutdown_slug) force_shutdown() return "" def force_shutdown(): """ Stop the flask web server, from the context of the flask app. """ # shutdown the flask service func = request.environ.get('werkzeug.server.shutdown') if func is None: raise RuntimeError('Not running with the Werkzeug Server') func() def start(port, stay_open=False, transparent_torification=False): """ Start the flask web server. """ generate_slug() set_stay_open(stay_open) set_transparent_torification(transparent_torification) app.run(port=port, threaded=True) def stop(port): """ Stop the flask web server by loading /shutdown. """ # If the user cancels the download, let the download function know to stop # serving the file global client_cancel client_cancel = True # to stop flask, load http://127.0.0.1://shutdown try: if transparent_torification: s = socket.socket() s.connect(('127.0.0.1', port)) s.sendall('GET /{0:s}/shutdown HTTP/1.1\r\n\r\n'.format(shutdown_slug)) else: urlopen('http://127.0.0.1:{0:d}/{1:s}/shutdown'.format(port, shutdown_slug)).read() except: pass onionshare-0.9.2/onionshare_gui/000077500000000000000000000000001301215300200166635ustar00rootroot00000000000000onionshare-0.9.2/onionshare_gui/__init__.py000066400000000000000000000013741301215300200210010ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 . """ from .onionshare_gui import * onionshare-0.9.2/onionshare_gui/downloads.py000066400000000000000000000100721301215300200212270ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 time from PyQt5 import QtCore, QtWidgets from onionshare import strings, helpers class Download(object): def __init__(self, download_id, total_bytes): self.download_id = download_id self.started = time.time() self.total_bytes = total_bytes self.downloaded_bytes = 0 # make a new progress bar self.progress_bar = QtWidgets.QProgressBar() self.progress_bar.setTextVisible(True) self.progress_bar.setAlignment(QtCore.Qt.AlignHCenter) self.progress_bar.setMinimum(0) self.progress_bar.setMaximum(total_bytes) self.progress_bar.setValue(0) self.progress_bar.setStyleSheet( "QProgressBar::chunk { background-color: #05B8CC; }") self.progress_bar.total_bytes = total_bytes # start at 0 self.update(0) def update(self, downloaded_bytes): self.downloaded_bytes = downloaded_bytes self.progress_bar.setValue(downloaded_bytes) if downloaded_bytes == self.progress_bar.total_bytes: pb_fmt = strings._('gui_download_progress_complete').format( helpers.format_seconds(time.time() - self.started)) else: elapsed = time.time() - self.started if elapsed < 10: # Wait a couple of seconds for the download rate to stabilize. # This prevents an "Windows copy dialog"-esque experience at # the beginning of the download. pb_fmt = strings._('gui_download_progress_starting').format( helpers.human_readable_filesize(downloaded_bytes)) else: pb_fmt = strings._('gui_download_progress_eta').format( helpers.human_readable_filesize(downloaded_bytes), self.estimated_time_remaining) self.progress_bar.setFormat(pb_fmt) def cancel(self): self.progress_bar.setFormat(strings._('gui_canceled')) @property def estimated_time_remaining(self): return helpers.estimated_time_remaining(self.downloaded_bytes, self.total_bytes, self.started) class Downloads(QtWidgets.QVBoxLayout): """ The downloads chunk of the GUI. This lists all of the active download progress bars. """ def __init__(self): super(Downloads, self).__init__() self.downloads = {} # downloads label self.downloads_label = QtWidgets.QLabel(strings._('gui_downloads', True)) self.downloads_label.hide() # add the widgets self.addWidget(self.downloads_label) def add_download(self, download_id, total_bytes): """ Add a new download progress bar. """ self.downloads_label.show() # add it to the list download = Download(download_id, total_bytes) self.downloads[download_id] = download self.addWidget(download.progress_bar) def update_download(self, download_id, downloaded_bytes): """ Update the progress of a download progress bar. """ self.downloads[download_id].update(downloaded_bytes) def cancel_download(self, download_id): """ Update a download progress bar to show that it has been canceled. """ self.downloads[download_id].cancel() onionshare-0.9.2/onionshare_gui/file_selection.py000066400000000000000000000206611301215300200222260ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 from PyQt5 import QtCore, QtWidgets, QtGui from onionshare import strings, helpers class FileList(QtWidgets.QListWidget): """ The list of files and folders in the GUI. """ files_dropped = QtCore.pyqtSignal() files_updated = QtCore.pyqtSignal() def __init__(self, parent=None): super(FileList, self).__init__(parent) self.setAcceptDrops(True) self.setIconSize(QtCore.QSize(32, 32)) self.setSortingEnabled(True) class DropHereLabel(QtWidgets.QLabel): """ When there are no files or folders in the FileList yet, display the 'drop files here' message and graphic. """ def __init__(self, parent, image=False): self.parent = parent super(DropHereLabel, self).__init__(parent=parent) self.setAcceptDrops(True) self.setAlignment(QtCore.Qt.AlignCenter) if image: self.setPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(helpers.get_resource_path('images/drop_files.png')))) else: self.setText(strings._('gui_drag_and_drop', True)) self.setStyleSheet('color: #999999;') self.hide() def dragEnterEvent(self, event): self.parent.drop_here_image.hide() self.parent.drop_here_text.hide() event.ignore() self.drop_here_image = DropHereLabel(self, True) self.drop_here_text = DropHereLabel(self, False) self.filenames = [] self.update() def update(self): """ Update the GUI elements based on the current state. """ # file list should have a background image if empty if len(self.filenames) == 0: self.drop_here_image.show() self.drop_here_text.show() else: self.drop_here_image.hide() self.drop_here_text.hide() def resizeEvent(self, event): """ When the widget is resized, resize the drop files image and text. """ self.drop_here_image.setGeometry(0, 0, self.width(), self.height()) self.drop_here_text.setGeometry(0, 0, self.width(), self.height()) def dragEnterEvent(self, event): """ dragEnterEvent for dragging files and directories into the widget. """ if event.mimeData().hasUrls: event.accept() else: event.ignore() def dragLeaveEvent(self, event): """ dragLeaveEvent for dragging files and directories into the widget. """ event.accept() self.update() def dragMoveEvent(self, event): """ dragMoveEvent for dragging files and directories into the widget. """ if event.mimeData().hasUrls: event.setDropAction(QtCore.Qt.CopyAction) event.accept() else: event.ignore() def dropEvent(self, event): """ dropEvent for dragging files and directories into the widget. """ if event.mimeData().hasUrls: event.setDropAction(QtCore.Qt.CopyAction) event.accept() for url in event.mimeData().urls(): filename = str(url.toLocalFile()) self.add_file(filename) else: event.ignore() self.files_dropped.emit() def add_file(self, filename): """ Add a file or directory to this widget. """ if filename not in self.filenames: self.filenames.append(filename) fileinfo = QtCore.QFileInfo(filename) basename = os.path.basename(filename.rstrip('/')) ip = QtWidgets.QFileIconProvider() icon = ip.icon(fileinfo) if os.path.isfile(filename): size = helpers.human_readable_filesize(fileinfo.size()) else: size = helpers.human_readable_filesize(helpers.dir_size(filename)) item_name = '{0:s} ({1:s})'.format(basename, size) item = QtWidgets.QListWidgetItem(item_name) item.setToolTip(size) item.setIcon(icon) self.addItem(item) self.files_updated.emit() class FileSelection(QtWidgets.QVBoxLayout): """ The list of files and folders in the GUI, as well as buttons to add and delete the files and folders. """ def __init__(self): super(FileSelection, self).__init__() self.server_on = False # file list self.file_list = FileList() self.file_list.currentItemChanged.connect(self.update) self.file_list.files_dropped.connect(self.update) # buttons self.add_files_button = QtWidgets.QPushButton(strings._('gui_add_files', True)) self.add_files_button.clicked.connect(self.add_files) self.add_dir_button = QtWidgets.QPushButton(strings._('gui_add_folder', True)) self.add_dir_button.clicked.connect(self.add_dir) self.delete_button = QtWidgets.QPushButton(strings._('gui_delete', True)) self.delete_button.clicked.connect(self.delete_file) button_layout = QtWidgets.QHBoxLayout() button_layout.addWidget(self.add_files_button) button_layout.addWidget(self.add_dir_button) button_layout.addWidget(self.delete_button) # add the widgets self.addWidget(self.file_list) self.addLayout(button_layout) self.update() def update(self): """ Update the GUI elements based on the current state. """ # all buttons should be disabled if the server is on if self.server_on: self.add_files_button.setEnabled(False) self.add_dir_button.setEnabled(False) self.delete_button.setEnabled(False) else: self.add_files_button.setEnabled(True) self.add_dir_button.setEnabled(True) # delete button should be disabled if item isn't selected current_item = self.file_list.currentItem() if not current_item: self.delete_button.setEnabled(False) else: self.delete_button.setEnabled(True) # update the file list self.file_list.update() def add_files(self): """ Add files button clicked. """ filenames = QtWidgets.QFileDialog.getOpenFileNames( caption=strings._('gui_choose_files', True), options=QtWidgets.QFileDialog.ReadOnly) if filenames: for filename in filenames[0]: self.file_list.add_file(filename) self.update() def add_dir(self): """ Add folder button clicked. """ filename = QtWidgets.QFileDialog.getExistingDirectory( caption=strings._('gui_choose_folder', True), options=QtWidgets.QFileDialog.ReadOnly) if filename: self.file_list.add_file(str(filename)) self.update() def delete_file(self): """ Delete button clicked """ current_row = self.file_list.currentRow() self.file_list.filenames.pop(current_row) self.file_list.takeItem(current_row) self.update() def server_started(self): """ Gets called when the server starts. """ self.server_on = True self.file_list.setAcceptDrops(False) self.update() def server_stopped(self): """ Gets called when the server stops. """ self.server_on = False self.file_list.setAcceptDrops(True) self.update() def get_num_files(self): """ Returns the total number of files and folders in the list. """ return len(self.file_list.filenames) onionshare-0.9.2/onionshare_gui/onionshare_gui.py000066400000000000000000000326151301215300200222550ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 . """ from __future__ import division import os, sys, subprocess, inspect, platform, argparse, threading, time, math, inspect, platform from PyQt5 import QtCore, QtWidgets, QtGui import onionshare from onionshare import strings, helpers, web from .file_selection import FileSelection from .server_status import ServerStatus from .downloads import Downloads from .options import Options class Application(QtWidgets.QApplication): """ This is Qt's QApplication class. It has been overridden to support threads and the quick keyboard shortcut. """ def __init__(self): platform = helpers.get_platform() if platform == 'Linux': self.setAttribute(QtCore.Qt.AA_X11InitThreads, True) QtWidgets.QApplication.__init__(self, sys.argv) self.installEventFilter(self) def eventFilter(self, obj, event): if (event.type() == QtCore.QEvent.KeyPress and event.key() == QtCore.Qt.Key_Q and event.modifiers() == QtCore.Qt.ControlModifier): self.quit() return False class OnionShareGui(QtWidgets.QMainWindow): """ OnionShareGui is the main window for the GUI that contains all of the GUI elements. """ start_server_finished = QtCore.pyqtSignal() stop_server_finished = QtCore.pyqtSignal() starting_server_step2 = QtCore.pyqtSignal() starting_server_step3 = QtCore.pyqtSignal() starting_server_error = QtCore.pyqtSignal(str) def __init__(self, qtapp, app): super(OnionShareGui, self).__init__() self.qtapp = qtapp self.app = app self.setWindowTitle('OnionShare') self.setWindowIcon(window_icon) def send_files(self, filenames=None): """ Build the GUI in send files mode. Note that this is the only mode currently implemented. """ # file selection self.file_selection = FileSelection() if filenames: for filename in filenames: self.file_selection.file_list.add_file(filename) # server status self.server_status = ServerStatus(self.qtapp, self.app, web, self.file_selection) self.server_status.server_started.connect(self.file_selection.server_started) self.server_status.server_started.connect(self.start_server) self.server_status.server_stopped.connect(self.file_selection.server_stopped) self.server_status.server_stopped.connect(self.stop_server) self.start_server_finished.connect(self.clear_message) self.start_server_finished.connect(self.server_status.start_server_finished) self.stop_server_finished.connect(self.server_status.stop_server_finished) self.file_selection.file_list.files_updated.connect(self.server_status.update) self.server_status.url_copied.connect(self.copy_url) self.starting_server_step2.connect(self.start_server_step2) self.starting_server_step3.connect(self.start_server_step3) self.starting_server_error.connect(self.start_server_error) # filesize warning self.filesize_warning = QtWidgets.QLabel() self.filesize_warning.setStyleSheet('padding: 10px 0; font-weight: bold; color: #333333;') self.filesize_warning.hide() # downloads self.downloads = Downloads() # options self.options = Options(web, self.app) # status bar self.status_bar = QtWidgets.QStatusBar() self.status_bar.setSizeGripEnabled(False) version_label = QtWidgets.QLabel('v{0:s}'.format(helpers.get_version())) version_label.setStyleSheet('color: #666666; padding: 0 10px;') self.status_bar.addPermanentWidget(version_label) self.setStatusBar(self.status_bar) # main layout self.layout = QtWidgets.QVBoxLayout() self.layout.addLayout(self.file_selection) self.layout.addLayout(self.server_status) self.layout.addWidget(self.filesize_warning) self.layout.addLayout(self.downloads) self.layout.addLayout(self.options) central_widget = QtWidgets.QWidget() central_widget.setLayout(self.layout) self.setCentralWidget(central_widget) self.show() # check for requests frequently self.timer = QtCore.QTimer() self.timer.timeout.connect(self.check_for_requests) self.timer.start(500) def start_server(self): """ Start the onionshare server. This uses multiple threads to start the Tor onion server and the web app. """ # Reset web counters web.download_count = 0 web.error404_count = 0 web.set_gui_mode() # pick an available local port for the http service to listen on self.app.choose_port() # start onionshare http service in new thread t = threading.Thread(target=web.start, args=(self.app.port, self.app.stay_open, self.app.transparent_torification)) t.daemon = True t.start() # wait for modules in thread to load, preventing a thread-related cx_Freeze crash time.sleep(0.2) # start the onion service in a new thread def start_onion_service(self): self.status_bar.showMessage(strings._('gui_starting_server1', True)) try: self.app.start_onion_service() self.starting_server_step2.emit() except onionshare.onion.NoTor as e: self.starting_server_error.emit(e.args[0]) return t = threading.Thread(target=start_onion_service, kwargs={'self': self}) t.daemon = True t.start() def start_server_step2(self): """ Step 2 in starting the onionshare server. Prepare files for serving. """ # prepare the files for sending in a new thread def finish_starting_server(self): # prepare files to share web.set_file_info(self.file_selection.file_list.filenames) self.app.cleanup_filenames.append(web.zip_filename) self.starting_server_step3.emit() # wait for hs if not self.app.local_only and not self.app.onion.supports_ephemeral: self.status_bar.showMessage(strings._('gui_starting_server3', True)) self.app.onion.wait_for_hs(self.app.onion_host) # done self.start_server_finished.emit() self.status_bar.showMessage(strings._('gui_starting_server2', True)) t = threading.Thread(target=finish_starting_server, kwargs={'self': self}) t.daemon = True t.start() def start_server_step3(self): """ Step 3 in starting the onionshare server. This displays the large filesize warning, if applicable. """ # warn about sending large files over Tor if web.zip_filesize >= 157286400: # 150mb self.filesize_warning.setText(strings._("large_filesize", True)) self.filesize_warning.show() def start_server_error(self, error): """ If there's an error when trying to start the onion service """ alert(error, QtWidgets.QMessageBox.Warning) self.server_status.stop_server() self.status_bar.clearMessage() def stop_server(self): """ Stop the onionshare server. """ if self.server_status.status != self.server_status.STATUS_STOPPED: web.stop(self.app.port) self.app.cleanup() self.filesize_warning.hide() self.stop_server_finished.emit() def check_for_requests(self): """ Check for messages communicated from the web app, and update the GUI accordingly. """ self.update() # only check for requests if the server is running if self.server_status.status != self.server_status.STATUS_STARTED: return events = [] done = False while not done: try: r = web.q.get(False) events.append(r) except web.queue.Empty: done = True for event in events: if event["type"] == web.REQUEST_LOAD: self.status_bar.showMessage(strings._('download_page_loaded', True)) elif event["type"] == web.REQUEST_DOWNLOAD: self.downloads.add_download(event["data"]["id"], web.zip_filesize) elif event["type"] == web.REQUEST_RATE_LIMIT: self.stop_server() alert(strings._('error_rate_limit'), QtWidgets.QMessageBox.Critical) elif event["type"] == web.REQUEST_PROGRESS: self.downloads.update_download(event["data"]["id"], event["data"]["bytes"]) # is the download complete? if event["data"]["bytes"] == web.zip_filesize: # close on finish? if not web.get_stay_open(): self.server_status.stop_server() elif event["type"] == web.REQUEST_CANCELED: self.downloads.cancel_download(event["data"]["id"]) elif event["path"] != '/favicon.ico': self.status_bar.showMessage('[#{0:d}] {1:s}: {2:s}'.format(web.error404_count, strings._('other_page_loaded', True), event["path"])) def copy_url(self): """ When the URL gets copied to the clipboard, display this in the status bar. """ self.status_bar.showMessage(strings._('gui_copied_url', True), 2000) def clear_message(self): """ Clear messages from the status bar. """ self.status_bar.clearMessage() def closeEvent(self, e): if self.server_status.status != self.server_status.STATUS_STOPPED: dialog = QtWidgets.QMessageBox() dialog.setWindowTitle("OnionShare") dialog.setText(strings._('gui_quit_warning', True)) quit_button = dialog.addButton(strings._('gui_quit_warning_quit', True), QtWidgets.QMessageBox.YesRole) dont_quit_button = dialog.addButton(strings._('gui_quit_warning_dont_quit', True), QtWidgets.QMessageBox.NoRole) dialog.setDefaultButton(dont_quit_button) reply = dialog.exec_() # Quit if reply == 0: self.stop_server() e.accept() # Don't Quit else: e.ignore() def alert(msg, icon=QtWidgets.QMessageBox.NoIcon): """ Pop up a message in a dialog window. """ dialog = QtWidgets.QMessageBox() dialog.setWindowTitle("OnionShare") dialog.setWindowIcon(window_icon) dialog.setText(msg) dialog.setIcon(icon) dialog.exec_() def main(): """ The main() function implements all of the logic that the GUI version of onionshare uses. """ strings.load_strings(helpers) print(strings._('version_string').format(helpers.get_version())) # start the Qt app global qtapp qtapp = Application() # parse arguments parser = argparse.ArgumentParser() parser.add_argument('--local-only', action='store_true', dest='local_only', help=strings._("help_local_only")) parser.add_argument('--stay-open', action='store_true', dest='stay_open', help=strings._("help_stay_open")) parser.add_argument('--debug', action='store_true', dest='debug', help=strings._("help_debug")) parser.add_argument('--transparent', action='store_true', dest='transparent_torification', help=strings._("help_transparent_torification")) parser.add_argument('--filenames', metavar='filenames', nargs='+', help=strings._('help_filename')) args = parser.parse_args() filenames = args.filenames if filenames: for i in range(len(filenames)): filenames[i] = os.path.abspath(filenames[i]) local_only = bool(args.local_only) stay_open = bool(args.stay_open) debug = bool(args.debug) transparent_torification = bool(args.transparent_torification) # create the onionshare icon global window_icon window_icon = QtGui.QIcon(helpers.get_resource_path('images/logo.png')) # validation if filenames: valid = True for filename in filenames: if not os.path.exists(filename): alert(strings._("not_a_file", True).format(filename)) valid = False if not valid: sys.exit() # start the onionshare app web.set_stay_open(stay_open) web.set_transparent_torification(transparent_torification) app = onionshare.OnionShare(debug, local_only, stay_open, transparent_torification) # clean up when app quits def shutdown(): app.cleanup() qtapp.aboutToQuit.connect(shutdown) # launch the gui gui = OnionShareGui(qtapp, app) gui.send_files(filenames) # all done sys.exit(qtapp.exec_()) if __name__ == '__main__': main() onionshare-0.9.2/onionshare_gui/options.py000066400000000000000000000035311301215300200207320ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 . """ from PyQt5 import QtCore, QtWidgets from onionshare import strings, helpers class Options(QtWidgets.QHBoxLayout): """ The extra onionshare options in the GUI. """ def __init__(self, web, app): super(Options, self).__init__() self.web = web self.app = app # close automatically self.close_automatically = QtWidgets.QCheckBox() if self.web.stay_open: self.close_automatically.setCheckState(QtCore.Qt.Unchecked) else: self.close_automatically.setCheckState(QtCore.Qt.Checked) self.close_automatically.setText(strings._("close_on_finish", True)) self.close_automatically.stateChanged.connect(self.stay_open_changed) # add the widgets self.addWidget(self.close_automatically) def stay_open_changed(self, state): """ When the 'close automatically' checkbox is toggled, let the web app know. """ if state > 0: self.web.set_stay_open(False) self.app.stay_open = False else: self.web.set_stay_open(True) self.app.stay_open = True onionshare-0.9.2/onionshare_gui/server_status.py000066400000000000000000000132141301215300200221470ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 platform from PyQt5 import QtCore, QtWidgets, QtGui from onionshare import strings, helpers class ServerStatus(QtWidgets.QVBoxLayout): """ The server status chunk of the GUI. """ server_started = QtCore.pyqtSignal() server_stopped = QtCore.pyqtSignal() url_copied = QtCore.pyqtSignal() STATUS_STOPPED = 0 STATUS_WORKING = 1 STATUS_STARTED = 2 def __init__(self, qtapp, app, web, file_selection): super(ServerStatus, self).__init__() self.status = self.STATUS_STOPPED self.qtapp = qtapp self.app = app self.web = web self.file_selection = file_selection # server layout self.status_image_stopped = QtGui.QImage(helpers.get_resource_path('images/server_stopped.png')) self.status_image_working = QtGui.QImage(helpers.get_resource_path('images/server_working.png')) self.status_image_started = QtGui.QImage(helpers.get_resource_path('images/server_started.png')) self.status_image_label = QtWidgets.QLabel() self.status_image_label.setFixedWidth(30) self.server_button = QtWidgets.QPushButton() self.server_button.clicked.connect(self.server_button_clicked) server_layout = QtWidgets.QHBoxLayout() server_layout.addWidget(self.status_image_label) server_layout.addWidget(self.server_button) # url layout url_font = QtGui.QFont() self.url_label = QtWidgets.QLabel() self.url_label.setFont(url_font) self.url_label.setWordWrap(False) self.url_label.setAlignment(QtCore.Qt.AlignCenter) self.copy_url_button = QtWidgets.QPushButton(strings._('gui_copy_url', True)) self.copy_url_button.clicked.connect(self.copy_url) url_layout = QtWidgets.QHBoxLayout() url_layout.addWidget(self.url_label) url_layout.addWidget(self.copy_url_button) # add the widgets self.addLayout(server_layout) self.addLayout(url_layout) self.update() def update(self): """ Update the GUI elements based on the current state. """ # set the status image if self.status == self.STATUS_STOPPED: self.status_image_label.setPixmap(QtGui.QPixmap.fromImage(self.status_image_stopped)) elif self.status == self.STATUS_WORKING: self.status_image_label.setPixmap(QtGui.QPixmap.fromImage(self.status_image_working)) elif self.status == self.STATUS_STARTED: self.status_image_label.setPixmap(QtGui.QPixmap.fromImage(self.status_image_started)) # set the URL fields if self.status == self.STATUS_STARTED: self.url_label.setText('http://{0:s}/{1:s}'.format(self.app.onion_host, self.web.slug)) self.url_label.show() self.copy_url_button.show() # resize parent widget p = self.parentWidget() p.resize(p.sizeHint()) else: self.url_label.hide() self.copy_url_button.hide() # button if self.file_selection.get_num_files() == 0: self.server_button.setEnabled(False) self.server_button.setText(strings._('gui_start_server', True)) else: if self.status == self.STATUS_STOPPED: self.server_button.setEnabled(True) self.server_button.setText(strings._('gui_start_server', True)) elif self.status == self.STATUS_STARTED: self.server_button.setEnabled(True) self.server_button.setText(strings._('gui_stop_server', True)) else: self.server_button.setEnabled(False) self.server_button.setText(strings._('gui_please_wait')) def server_button_clicked(self): """ Toggle starting or stopping the server. """ if self.status == self.STATUS_STOPPED: self.start_server() elif self.status == self.STATUS_STARTED: self.stop_server() def start_server(self): """ Start the server. """ self.status = self.STATUS_WORKING self.update() self.server_started.emit() def start_server_finished(self): """ The server has finished starting. """ self.status = self.STATUS_STARTED self.copy_url() self.update() def stop_server(self): """ Stop the server. """ self.status = self.STATUS_WORKING self.update() self.server_stopped.emit() def stop_server_finished(self): """ The server has finished stopping. """ self.status = self.STATUS_STOPPED self.update() def copy_url(self): """ Copy the onionshare URL to the clipboard. """ url = 'http://{0:s}/{1:s}'.format(self.app.onion_host, self.web.slug) clipboard = self.qtapp.clipboard() clipboard.setText(url) self.url_copied.emit() onionshare-0.9.2/resources/000077500000000000000000000000001301215300200156645ustar00rootroot00000000000000onionshare-0.9.2/resources/html/000077500000000000000000000000001301215300200166305ustar00rootroot00000000000000onionshare-0.9.2/resources/html/404.html000066400000000000000000000005161301215300200200270ustar00rootroot00000000000000 Error 404 404 onionshare-0.9.2/resources/html/denied.html000066400000000000000000000005431301215300200207500ustar00rootroot00000000000000 OnionShare

OnionShare download in progress

onionshare-0.9.2/resources/html/index.html000066400000000000000000000100221301215300200206200ustar00rootroot00000000000000 OnionShare

{{ filename }} ▼

{{ filesize_human }}

{% for info in file_info.dirs %} {% endfor %} {% for info in file_info.files %} {% endfor %}
{{ info.basename }} {{ info.size_human }}
{{ info.basename }} {{ info.size_human }}
onionshare-0.9.2/resources/images/000077500000000000000000000000001301215300200171315ustar00rootroot00000000000000onionshare-0.9.2/resources/images/drop_files.png000066400000000000000000000037631301215300200217760ustar00rootroot00000000000000PNG  IHDR<qbKGDC pHYs  tIME4luiTXtCommentCreated with GIMPd.eWIDATx]oG;!QZJ *Pm4G/XX4vfvH{3gΌ7g#ܷB%$XBS@UEd#Vt=wI'4U5s X+)mVzq%4iPPo(olp8H!2W|=IU|E'\YSW迕#Ab %$XBH,!Bb %$KH,!XBb %K!B!B!B#1 %$XBb !K%$XBH,!Bb %$K!B!B!0GA׿Սdxwgoq^a5iq핮 xiiqmGMg5Q@Go-mnb)'^bu1uaHe(_3sY,merMaI YT/L$MIaަ'D6z3KؽRO20gyT/Ӥ08 <mKL 9:)#97OoPqKcP[务iE>3QwŁ< 9r =sz>rjsf_za)v܄P-r8W@/I'2zWt;7I._һ:h[L!Bֲx +IENDB`onionshare-0.9.2/resources/images/logo.png000066400000000000000000000073601301215300200206050ustar00rootroot00000000000000PNG  IHDRPPbKGD pHYs  tIME2}IDATx{PTW? Vz'hGjifAktcƬaqG1h԰e&T1qtEBJF@2ը`"+t4зowGYs9{ Љb3ېd)t`0 X+8<7 7*Imx̶1<@|{,v&B'LC6$Yʏ70!$K: %Yrģ1g3ۚP |=G﯀Zi`Lj]B2\*xVkL4Q8v?t+)D}нe$K ;MmfX=84ʍȲ,4ʍ8x|>_,\K⢁Ml x4*~,,X[ J#cb),]~[˽{/:ύ+7U}ڪZjԢ7uQk?Jt7Q`dOAo3'3cQӻ\uwطz =bTV $Dt ,۔@>9x <|'?IL^̊10ƒ>zdIr _ղlAoj_o#!1S#_(i9K40j'})x>AX~`9*vux 7bhcN*nqDZЊ.;]zLgaC!Ȁ48F>=K{'Y%#69!DbVYňFtɈ/&癜HIr[|p2&ftٔ#cb ҰOGcĀ*tl;REv:G͏Tr {ЮJU%Yz]`5Yt=s;,ݻ о.]N;cnJ2ggj~ύnpe5p˾V1w9\?h-ol!/7Q#%zme:Z[Ft6/ zAM" qSpnZdYfޥXlnpT{XIYov5ݯ7A5"ÍjƼ2W7ʔ4ErSQZ1eEQnd龥yBv,b֛BKܥ=tOˢR^^2gO  \(e3 AijZE B^z:{,˧/ofmDE,]6tp5"_F:}C3i恍XܚzLj^ `K@ZMv(9%9  lY%n;|r) W_>uAx@tc;b7:"kq|RS5("uC*8PɋBn}&&,iy MXu!u uqBh0(:XDܨ(>RvD;PU}Ksr>󵙭mG|5Q'ryf./eu2()/ +U!)52wx6u[-LMRy9紫jUL&&pb |^_D4({ż_*Yyf=Fɱ6R%Iʙ+=x6]v]ᢿO8o.Bn7F^Q/Bbf{Q!k-rM$[OAQ5v*>EPQT@3vZlWGjUnU"w":j(ÞFrɉfQh|[o 0`/t)/`4hG|kjbŘn)[nEoG$Yjs&JIjcJ4LUt3m $S$0)TRr*Uj߬( ovh(( +-^7U5Sl^"+6lE g?M.^rֲBuTtSpݱ-[xAQAi^)3̠XbEX 3̠4T xE,-?̞K'sI 40ȱ\q \6-gI*cFe|͠*^__Nh+ԉ(Hמ1 0OMl@SՍ ygD,=F)1*I@~u '0.{ r+@{.6d<5XPg*ɒ1Wg=; a?ZK%IENDB`onionshare-0.9.2/resources/images/server_started.png000066400000000000000000000005321301215300200226730ustar00rootroot00000000000000PNG  IHDR bKGD pHYs  tIME9 LRtEXtCommentCreated with GIMPWIDAT8˵ 0Dnt^E,H 3Pc,*ID@ΰ, c qE*120} तX;))`, {mXyJHEk{c$W&T`aSQK#ZOV }0Dae`%;ZlIENDB`onionshare-0.9.2/resources/images/server_stopped.png000066400000000000000000000004361301215300200227060ustar00rootroot00000000000000PNG  IHDR bKGD pHYs  tIME9ܮObtEXtCommentCreated with GIMPWIDAT8˵ @ 'z+\Ԁ{qq8C &HќVxJ:.X>]:a6t>]l/L&;0+F`=אut|c?ЕIENDB`onionshare-0.9.2/resources/images/server_working.png000066400000000000000000000005221301215300200227040ustar00rootroot00000000000000PNG  IHDR bKGD pHYs  tIME9$y tEXtCommentCreated with GIMPWIDAT8˵1 0?3y^zAȔS$+Xؑh\ D8cќh9?!h@[lj,[gnvb)5R %{L"$rY22RL3Iy A&waI>l\e_/+/2IENDB`onionshare-0.9.2/resources/license.txt000066400000000000000000001045771301215300200200650ustar00rootroot00000000000000Copyright (C) 2016 Micah Lee 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 . onionshare-0.9.2/resources/locale/000077500000000000000000000000001301215300200171235ustar00rootroot00000000000000onionshare-0.9.2/resources/locale/cs.json000066400000000000000000000054611301215300200204310ustar00rootroot00000000000000{ "connecting_ctrlport": "Připojuju se na kontrolní port Toru pro nastavení onion service na portu {0:d}.", "cant_connect_ctrlport": "Nejde se připojit na kontrolní port Toru na portu {0:s}. OnionShare vyžaduje, aby Tor Browser běžel na pozadí. Pokud ho nemáte, můžete ho stáhnout z https://www.torproject.org/.", "cant_connect_socksport": "Nejde se připojit na Tor SOCKS5 server na portu {0:s}. OnionShare vyžaduje, aby Tor Browser běžel na pozadí. Pokud ho nemáte, můžete ho stáhnout z https://www.torproject.org/.", "preparing_files": "Připravuji soubory na sdílení.", "wait_for_hs": "Čekám až bude onion service připravena:", "wait_for_hs_trying": "Zkouším...", "wait_for_hs_nope": "Ještě nepřipraven.", "wait_for_hs_yup": "Připraven!", "give_this_url": "Dejte tuto URL osobě, které dané soubory posíláte:", "ctrlc_to_stop": "Stiskněte Ctrl-C pro zastavení serveru", "not_a_file": "{0:s} není soubor.", "download_page_loaded": "Download page loaded", "other_page_loaded": "URL loaded", "close_on_finish": "Ukončit sdílení automaticky", "closing_automatically": "Closing automatically because download finished", "large_filesize": "Varování: Posílání velkých souborů může trvat hodiny", "error_tails_invalid_port": "Nesprávná hodnota, port musí být celé číslo", "error_tails_unknown_root": "Unknown error with Tails root process", "help_tails_port": "Tails only: port for opening firewall, starting onion service", "help_local_only": "Nepoužívat Tor: jen pro vývoj", "help_stay_open": "Nechat běžet onion service po skončení stahování", "help_transparent_torification": "My system is transparently torified", "help_debug": "Zaznamenat chyby na disk", "help_filename": "Seznam souborů a složek ke sdílení", "gui_drag_and_drop": "Táhni a pusť\nsoubory sem", "gui_add_files": "Přidat soubor", "gui_add_folder": "Přidat složku", "gui_delete": "Smazat", "gui_choose_files": "Vybrat soubory", "gui_choose_folder": "Vybrat složku", "gui_start_server": "Spustit sdílení", "gui_stop_server": "Zastavit sdílení", "gui_copy_url": "Kopírovat URL", "gui_downloads": "Stahování:", "gui_canceled": "Zrušeno", "gui_copied_url": "URL zkopírováno do schránky", "gui_starting_server1": "Spouštím Tor onion service...", "gui_starting_server2": "Crunching files...", "gui_starting_server3": "Čekám na Tor onion service...", "gui_please_wait": "Prosím čekejte...", "error_hs_dir_cannot_create": "Nejde vytvořit složka {0:s} pro onion service", "error_hs_dir_not_writable": "Nejde zapisovat do složky {0:s} pro onion service", "using_ephemeral": "Staring ephemeral Tor onion service and awaiting publication" } onionshare-0.9.2/resources/locale/de.json000066400000000000000000000044341301215300200204130ustar00rootroot00000000000000{ "connecting_ctrlport": "Verbinde zum Tor-Kontrollport um den versteckten Dienst auf Port {0:d} laufen zu lassen.", "cant_connect_ctrlport": "Konnte keine Verbindung zum Tor-Kontrollport auf Port {0:s} aufbauen. Läuft Tor?", "cant_connect_socksport": "Konnte keine Verbindung zum Tor SOCKS5 Server auf Port {0:s} herstellen. OnionShare setzt voraus dass Tor Browser im Hintergrund läuft. Wenn du noch ihn noch noch nicht hast kannst du ihn unter https://www.torproject.org/ herunterladen.", "preparing_files": "Dateien werden vorbereitet.", "wait_for_hs": "Warte auf HS:", "wait_for_hs_trying": "Verbindungsversuch...", "wait_for_hs_nope": "Noch nicht bereit.", "wait_for_hs_yup": "Bereit!", "give_this_url": "Geben Sie diese URL der Person, der Sie die Datei zusenden möchten:", "ctrlc_to_stop": "Drücken Sie Strg+C um den Server anzuhalten", "not_a_file": "{0:s} ist keine Datei.", "download_page_loaded": "Seite geladen", "other_page_loaded": "URL geladen", "close_on_finish": "Den Server automatisch anhalten", "closing_automatically": "Halte automatisch an, da der Download beendet wurde", "large_filesize": "Warnung: Das Senden von großen Dateien kann Stunden dauern", "error_tails_invalid_port": "Ungültiger Wert, Port muss eine ganze Zahl sein", "error_tails_unknown_root": "Unbekannter Fehler mit Tails root Prozess", "help_tails_port": "Nur für Tails: Port um den Firewall zu öffnen, starte onion service", "help_local_only": "Nicht mit Tor benutzen, nur für Entwicklung", "help_stay_open": "Den onion service nicht anhalten nachdem ein Download beendet wurde", "help_debug": "Fehler auf Festplatte schreiben", "help_filename": "Liste der zu teilenden Dateien oder Verzeichnisse", "gui_drag_and_drop": "Drag & drop\nDateien hier", "gui_add_files": "Dateien hinzufügen", "gui_add_folder": "Verzeichnis hinzufügen", "gui_delete": "Löschen", "gui_choose_files": "Dateien auswählen", "gui_choose_folder": "Verzeichnis auswählen", "gui_start_server": "Server starten", "gui_stop_server": "Server anhalten", "gui_copy_url": "URL kopieren", "gui_downloads": "Downloads:", "gui_copied_url": "URL wurde in die Zwischenablage kopiert", "gui_please_wait": "Bitte warten..." } onionshare-0.9.2/resources/locale/en.json000066400000000000000000000064561301215300200204330ustar00rootroot00000000000000{ "connecting_ctrlport": "Connecting to Tor control port to set up onion service on port {0:d}.", "cant_connect_ctrlport": "Can't connect to Tor control port on port {0:s}. OnionShare requires Tor Browser to be running in the background to work. If you don't have it you can get it from https://www.torproject.org/.", "cant_connect_socksport": "Can't connect to Tor SOCKS5 server on port {0:s}. OnionShare requires Tor Browser to be running in the background to work. If you don't have it you can get it from https://www.torproject.org/.", "preparing_files": "Preparing files to share.", "wait_for_hs": "Waiting for HS to be ready:", "wait_for_hs_trying": "Trying...", "wait_for_hs_nope": "Not ready yet.", "wait_for_hs_yup": "Ready!", "give_this_url": "Give this URL to the person you're sending the file to:", "ctrlc_to_stop": "Press Ctrl-C to stop server", "not_a_file": "{0:s} is not a file.", "download_page_loaded": "Download page loaded", "other_page_loaded": "URL loaded", "close_on_finish": "Stop sharing automatically", "closing_automatically": "Closing automatically because download finished", "large_filesize": "Warning: Sending large files could take hours", "error_tails_invalid_port": "Invalid value, port must be an integer", "error_tails_unknown_root": "Unknown error with Tails root process", "help_tails_port": "Tails only: port for opening firewall, starting onion service", "help_local_only": "Do not attempt to use tor: for development only", "help_stay_open": "Keep onion service running after download has finished", "help_transparent_torification": "My system is transparently torified", "help_debug": "Log errors to disk", "help_filename": "List of files or folders to share", "gui_drag_and_drop": "Drag and drop\nfiles here", "gui_add_files": "Add Files", "gui_add_folder": "Add Folder", "gui_delete": "Delete", "gui_choose_files": "Choose files", "gui_choose_folder": "Choose folder", "gui_start_server": "Start Sharing", "gui_stop_server": "Stop Sharing", "gui_copy_url": "Copy URL", "gui_downloads": "Downloads:", "gui_canceled": "Canceled", "gui_copied_url": "Copied URL to clipboard", "gui_starting_server1": "Starting Tor onion service...", "gui_starting_server2": "Crunching files...", "gui_starting_server3": "Waiting for Tor onion service...", "gui_please_wait": "Please wait...", "error_hs_dir_cannot_create": "Cannot create onion service dir {0:s}", "error_hs_dir_not_writable": "onion service dir {0:s} is not writable", "using_ephemeral": "Staring ephemeral Tor onion service and awaiting publication", "gui_download_progress_complete": "%p%, Time Elapsed: {0:s}", "gui_download_progress_starting": "{0:s}, %p% (Computing ETA)", "gui_download_progress_eta": "{0:s}, ETA: {1:s}, %p%", "version_string": "Onionshare {0:s} | https://onionshare.org/", "gui_quit_warning": "Are you sure you want to quit?\nThe URL you are sharing won't exist anymore.", "gui_quit_warning_quit": "Quit", "gui_quit_warning_dont_quit": "Don't Quit", "error_rate_limit": "An attacker might be trying to guess your URL. To prevent this, OnionShare has automatically stopped the server. To share the files you must start it again and share the new URL." } onionshare-0.9.2/resources/locale/eo.json000066400000000000000000000054431301215300200204270ustar00rootroot00000000000000{ "connecting_ctrlport": "Konektas al Tor-kontrolpordo por starigi onion service je pordo {0:d}.", "cant_connect_ctrlport": "Ne eblas konekti al Tor-kontrolpordo je pordo {0:s}. OnionShare bezonas Tor Browser por esti ŝaltita en la fono. Se vi ne havas ĝin, vi povas ricevi ĝin je https://www.torproject.org/.", "cant_connect_socksport": "Ne eblas konekti al Tor-SOCKS5-servilo je pordo {0:s}. OnionShare bezonas Tor Browser por esti ŝaltita en la fono. Se vi ne havas ĝin, vi povas ricevi ĝin je https://www.torproject.org/.", "preparing_files": "Preparas dosierojn por kundivido.", "wait_for_hs": "Atendas por hidden sevice esti preta:", "wait_for_hs_trying": "Provas...", "wait_for_hs_nope": "Ankoraŭ ne preta.", "wait_for_hs_yup": "Preta!", "give_this_url": "Donu ĉi tiun URL al la persono al kiu vi sendas la dosieron:", "ctrlc_to_stop": "Presu Ctrl-C por halti la servilon", "not_a_file": "{0:s} ne estas dosiero.", "download_page_loaded": "Download page loaded", "other_page_loaded": "URL loaded", "close_on_finish": "Halti la kundividadon aŭtomate", "closing_automatically": "Fermas aŭtomate ĉar la elŝuto finiĝis", "large_filesize": "Atentigo: Sendado de grandaj dosieroj povas daŭri horojn", "error_tails_invalid_port": "Malĝusta valoro, pordo devas esti plena nombro", "error_tails_unknown_root": "Nekonata eraro kun Tails-root-procezo", "help_tails_port": "Tails only: port for opening firewall, starting onion service", "help_local_only": "Ne strebu uzi tor: nur por evoluado", "help_stay_open": "Lasu onion service funkcii post fino de elŝuto", "help_transparent_torification": "My system is transparently torified", "help_debug": "Protokoli erarojn sur diskon", "help_filename": "Listo de dosieroj aŭ dosierujoj por kundividi", "gui_drag_and_drop": "Ŝovu kaj metu\nla dosierojn ĉi tien", "gui_add_files": "Aldoni dosierojn", "gui_add_folder": "Aldoni dosierujon", "gui_delete": "Forviŝi", "gui_choose_files": "Elekti dosierojn", "gui_choose_folder": "Elekti dosierujon", "gui_start_server": "Komenci kundividi", "gui_stop_server": "Ĉesi kundividi", "gui_copy_url": "Kopii URL", "gui_downloads": "Elŝutoj:", "gui_canceled": "Nuligita", "gui_copied_url": "URL kopiita en tondujon", "gui_starting_server1": "Startigas Tor onion service...", "gui_starting_server2": "Crunching files...", "gui_starting_server3": "Atendas por Tor onion service...", "gui_please_wait": "Bonvolu atendi...", "error_hs_dir_cannot_create": "Ne eblas krei hidden-service-dosierujon {0:s}", "error_hs_dir_not_writable": "Ne eblas konservi dosierojn en hidden-service-dosierujo {0:s}", "using_ephemeral": "Staring ephemeral Tor onion service and awaiting publication" } onionshare-0.9.2/resources/locale/es.json000066400000000000000000000041251301215300200204270ustar00rootroot00000000000000{ "connecting_ctrlport": "Conectando a puerto control de Tor para configurar servicio oculto en puerto {0:d}.", "cant_connect_ctrlport": "No se pudo conectar a puerto control de Tor en puertos {0:s}. ¿Está funcionando Tor?", "cant_connect_socksport": "No se pudo conectar al servidor SOCKS5 de Tor en el puerto {0:s}. ¿Está funcionando Tor?", "preparing_files": "Preparando los archivos para compartir.", "wait_for_hs": "Esperando a que HS esté listo:", "wait_for_hs_trying": "Probando...", "wait_for_hs_nope": "No está listo todavía.", "wait_for_hs_yup": "Listo!", "give_this_url": "Entregue esta URL a la persona a la que está enviando el archivo:", "ctrlc_to_stop": "Pulse Ctrl-C para detener el servidor", "not_a_file": "{0:s} no es un archivo.", "download_page_loaded": "La página de descarga está lista.", "other_page_loaded": "La URL está lista.", "close_on_finish": "Apagar el servidor automáticamente.", "closing_automatically": "Apagando automáticamente porque la descarga finalizó", "error_tails_invalid_port": "Valor inválido, el puerto debe ser un entero", "error_tails_unknown_root": "Error desconocido en el proceso de Tails ejecutando como roo", "help_tails_port": "Sólo Tails: puerto para abrir en el firewall, al levantar el servicio oculto", "help_local_only": "No intentar usar Tor: sólo para desarrollo", "help_stay_open": "Mantener el servicio oculto ejecutando después de que la descarga haya finalizado", "help_debug": "Guardar registro de errores en el disco", "help_filename": "Lista de archivos o carpetas para compartir", "gui_drag_and_drop": "Arrastre\narchivos aquí", "gui_add_files": "Añadir Archivos", "gui_add_folder": "Añadir Carpeta", "gui_delete": "Eliminar", "gui_choose_files": "Elegir archivos", "gui_choose_folder": "Elegir carpeta", "gui_start_server": "Encender el Servidor", "gui_stop_server": "Detener el Servidor", "gui_copy_url": "Copiar URL", "gui_downloads": "Descargas:", "gui_copied_url": "Se copió la URL en el portapapeles" } onionshare-0.9.2/resources/locale/fi.json000066400000000000000000000056051301215300200204220ustar00rootroot00000000000000{ "connecting_ctrlport": "Yhdistetään Torin ohjausporttiin että saadaan salattu palvelin porttiin {0:d}.", "cant_connect_ctrlport": "Ei voi yhdistää Torin ohjausporttiin portissa {0:s}. OnionShare tarvitsee Tor Browserin toimimaan taustalla. Jos sinulla ei ole sitä niin voit hakea sen osoitteesta https://www.torproject.org/.", "cant_connect_socksport": "Ei voi yhdistää Tor SOCKS5 palveluun portissa {0:s}. OnionShare tarvitsee Tor Browserin toimimaan taustalla. Jos sinulla ei ole sitä niin voit hakea sen osoitteesta https://www.torproject.org/.", "preparing_files": "Valmistellaan tiedostoja jaettavaksi.", "wait_for_hs": "Odotetaan piilopalvelun valmistumista:", "wait_for_hs_trying": "Yritetään...", "wait_for_hs_nope": "Ei vielä valmis.", "wait_for_hs_yup": "Valmis!", "give_this_url": "Anna tämä URL-osoite henkilölle, jolle lähetät tiedostot:", "ctrlc_to_stop": "Näppäin Ctrl-C pysäyttää palvelimen", "not_a_file": "{0:s} Ei ole tiedosto.", "download_page_loaded": "Lataussivu ladattu", "other_page_loaded": "URL-osoite ladattu", "close_on_finish": "Pysäytä palvelin automaattisesti", "closing_automatically": "Lataus valmis. Suljetaan automaattisesti", "large_filesize": "Varoitus: Isojen tiedostojen lähetys saattaa kestää tunteja", "error_tails_invalid_port": "Väärä arvo, portti pitää olla koknaisluku", "error_tails_unknown_root": "Tuntematon virhe Tailsissa", "help_tails_port": "Vain Tails: portti palomuurin läpi, käynnistetään salainen palvelin", "help_local_only": "Älä käytä Toria: vain ohjelmakehitykseen", "help_stay_open": "Pidä piilopalvelu käynnissä latauksen jälkeen.", "help_transparent_torification": "Järjestelmäni käyttää Toria läpinäkyvästi", "help_debug": "Tallentaa virheet levylle", "help_filename": "Luettele jaettavat tiedostot tai kansiot", "gui_drag_and_drop": "Vedä ja pudota\ntiedostot tänne", "gui_add_files": "Lisää tiedostoja", "gui_add_folder": "Lisää kansio", "gui_delete": "Poista", "gui_choose_files": "Valitse tiedostoja", "gui_choose_folder": "Valitse kansio", "gui_start_server": "Käynnistä palvelin", "gui_stop_server": "Pysäytä palvelin", "gui_copy_url": "Kopioi URL-osoite", "gui_downloads": "Lataukset:", "gui_canceled": "Peruutettu", "gui_copied_url": "URL-osoite kopioitu leikepöydälle", "gui_starting_server1": "Käynnistetään Tor piilopalvelu...", "gui_starting_server2": "Tiivistän tiedostoja...", "gui_starting_server3": "Odotetaan Tor piilopalvelua...", "gui_please_wait": "Odota...", "error_hs_dir_cannot_create": "Piilopalvelulle ei pystytty luomaan hakemistoa {0:s}", "error_hs_dir_not_writable": "Piilopalvelun hakemistoon {0:s} ei voi kirjoittaa", "using_ephemeral": "Käynnistetään lyhytaikainen Tor piilopalvelu ja odotetaan julkaisua" } onionshare-0.9.2/resources/locale/fr.json000066400000000000000000000037421301215300200204330ustar00rootroot00000000000000{ "connecting_ctrlport": "Connexion au réseau Tor pour mettre en place un onion service sur le port {0:d}.", "cant_connect_ctrlport": "Impossible de se connecter au port de contrôle Tor sur le port {0:s}. Est-ce que Tor tourne ?", "preparing_files": "Préparation des fichiers à partager.", "wait_for_hs": "En attente du HS:", "wait_for_hs_trying": "Tentative...", "wait_for_hs_nope": "Pas encore prêt.", "wait_for_hs_yup": "Prêt !", "give_this_url": "Donnez cette URL à la personne qui doit recevoir le fichier :", "ctrlc_to_stop": "Ctrl-C arrête le serveur", "not_a_file": "{0:s} n'est pas un fichier.", "download_page_loaded": "Page de téléchargement chargée", "other_page_loaded": "URL chargée", "close_on_finish": "Arrêter le serveur automatiquement", "closing_automatically": "Fermeture automatique car le téléchargement est fini", "error_tails_invalid_port": "Valeur invalide, le port doit être un nombre entier", "error_tails_unknown_root": "Erreur inconnue avec un processus root sur Tails", "help_tails_port": "Seulement sur Tails: port pour ouvrir le firewall, démarrage du onion service", "help_local_only": "Ne tentez pas d'utiliser Tor, uniquement pour développement", "help_stay_open": "Laisser tourner le onion service après que le téléchargment soit fini", "help_debug": "Enregistrer les erreurs sur le disque", "help_filename": "Liste des fichiers ou dossiers à partager", "gui_drag_and_drop": "Glissez déposez\nles fichiers ici", "gui_add_files": "Ajouter des fichiers", "gui_add_folder": "Ajouter un dossier", "gui_delete": "Supprimer", "gui_choose_files": "Sélectionnez des fichiers", "gui_choose_folder": "Sélectionnez un dossier", "gui_start_server": "Démarrer le serveur", "gui_stop_server": "Arrêter le serveur", "gui_copy_url": "Copier URL", "gui_downloads": "Téléchargements :", "gui_copied_url": "URL copié dans le presse-papier" } onionshare-0.9.2/resources/locale/it.json000066400000000000000000000060401301215300200204320ustar00rootroot00000000000000{ "connecting_ctrlport": "Connessione alla porta di controllo di Tor per inizializzare il servizio nascosto sulla porta {0:d}.", "cant_connect_ctrlport": "Impossibile connettere alla porta di controllo di Tor sulla porta {0:s}. OnionShare richiede l'esecuzione in background di Tor Browser per funzionare. Se non è installato puoi scaricarlo da https://www.torproject.org/.", "cant_connect_socksport": "Impossibile connettersi al server Tor SOCKS5 sulla porta {0:s}. OnionShare richiede l'esecuzione in background di Tor Browser per funzionare. Se non è installato puoi scaricarlo da https://www.torproject.org/.", "preparing_files": "Preparazione dei files da condividere.", "wait_for_hs": "In attesa che l'HS sia pronto:", "wait_for_hs_trying": "Tentativo...", "wait_for_hs_nope": "Non è ancora pronto.", "wait_for_hs_yup": "Pronto!", "give_this_url": "Dai questo URL alla persona a cui vuoi inviare il file:", "ctrlc_to_stop": "Premi Ctrl-C per fermare il server", "not_a_file": "{0:s} non è un file.", "download_page_loaded": "Pagina di Download caricata", "other_page_loaded": "URL caricato", "close_on_finish": "Ferma la condivisione automaticamente", "closing_automatically": "Chiusura automatica dopo aver finito il download", "large_filesize": "Attenzione: Inviare file di grandi dimensioni può richiedere ore", "error_tails_invalid_port": "Valore non valido, la porta deve essere un numero intero", "error_tails_unknown_root": "Errore sconosciuto con il processo Tails root", "help_tails_port": "Solo per Tails: porta per passare il firewall, avvio del servizio nascosto", "help_local_only": "Non usare tor: è solo per lo sviluppo", "help_stay_open": "Mantieni il servizio nascosto avviato anche dopo aver finito il download", "help_transparent_torification": "Il mio sistema usa tor in modo trasparente", "help_debug": "Registra gli errori sul disco", "help_filename": "Lista dei file o cartelle da condividere", "gui_drag_and_drop": "Prendi e rilascia\ni file qui sopra", "gui_add_files": "Aggiungi il Files", "gui_add_folder": "Aggiungi la Cartella", "gui_delete": "Cancella", "gui_choose_files": "Scegli il file", "gui_choose_folder": "Scegli la cartella", "gui_start_server": "Inizia la condivisione", "gui_stop_server": "Ferma la condivisione", "gui_copy_url": "Copia lo URL", "gui_downloads": "Downloads:", "gui_canceled": "Cancellati", "gui_copied_url": "URL Copiato nella clipboard", "gui_starting_server1": "Avviamento del servizio nascosto Tor...", "gui_starting_server2": "Elaborazione files...", "gui_starting_server3": "In attesa del servizio nascosto Tor...", "gui_please_wait": "Attendere prego...", "error_hs_dir_cannot_create": "Impossibile create la cartella per il servizio nascosto {0:s}", "error_hs_dir_not_writable": "La cartella per il servizio nascosto {0:s} non ha i permessi di scrittura", "using_ephemeral": "Avviamento del servizio nascosto Tor ephemeral e attesa della pubblicazione" }onionshare-0.9.2/resources/locale/nl.json000066400000000000000000000055401301215300200204330ustar00rootroot00000000000000{ "connecting_ctrlport": "Verbinden met de Tor controle port om een verborgen service op te zetten op poort {0:d}.", "cant_connect_ctrlport": "Kan geen verbinding maken met Tor controle poort op poort {0:s}. OnionShare heeft de Tor Browser op de achtergrond nodig om te kunnen werken. Deze kan je verkrijgen via https://www.torproject.org/.", "cant_connect_socksport": "Kan geen verbinding maken met de Tor SOCKS5 server op poort {0:s}. OnionShare heeft de Tor Browser op de achtergrond nodig om te werken. Deze kan je verkrijgen via https://www.torproject.org/.", "preparing_files": "Bestanden om te delen aan het voorbereiden.", "wait_for_hs": "Wachten op gereed zijn van HS:", "wait_for_hs_trying": "Proberen...", "wait_for_hs_nope": "Nog niet gereed.", "wait_for_hs_yup": "Gereed!", "give_this_url": "Geef deze URL aan de persoon aan wie je dit bestand verzend:", "ctrlc_to_stop": "Druk Ctrl-C om de server te stoppen", "not_a_file": "{0:s} is geen bestand.", "download_page_loaded": "Downloadpagina geladen", "other_page_loaded": "URL geladen", "close_on_finish": "Stop server automatisch", "closing_automatically": "Sluit nu automatisch omdat download gereed is", "large_filesize": "Waarschuwing: Versturen van grote bestanden kan uren duren", "error_tails_invalid_port": "Ongeldige waarde, poort moet een integer zijn", "error_tails_unknown_root": "Onbekende fout met het Tails root proces", "help_tails_port": "Alleen Tails: poort voor het openen van firewall, starten verborgen service", "help_local_only": "Maak geen gebruik van Tor, alleen voor ontwikkeling", "help_stay_open": "Laat verborgen service draaien nadat download gereed is", "help_transparent_torification": "Mijn systeem gebruikt Tor als proxyserver", "help_debug": "Log fouten naar harde schijf", "help_filename": "Lijst van bestanden of mappen om te delen", "gui_drag_and_drop": "Sleep en zet\nbestanden hier neer", "gui_add_files": "Bestanden toevoegen", "gui_add_folder": "Map toevoegen", "gui_delete": "Verwijder", "gui_choose_files": "Kies bestanden", "gui_choose_folder": "Kies map", "gui_start_server": "Start server", "gui_stop_server": "Stop server", "gui_copy_url": "Kopier URL", "gui_downloads": "Downloads:", "gui_canceled": "Afgebroken", "gui_copied_url": "URL gekopieerd naar klembord", "gui_starting_server1": "Tor onion service wordt gestart...", "gui_starting_server2": "Bestanden verwerken...", "gui_starting_server3": "Wachten op Tor onion service...", "gui_please_wait": "Moment geduld...", "error_hs_dir_cannot_create": "Kan verborgen service map {0:s} niet aanmaken", "error_hs_dir_not_writable": "Verborgen service map {0:s} is niet schrijfbaar", "using_ephemeral": "Kortstondige Tor onion service gestart en in afwachting van publicatie" } onionshare-0.9.2/resources/locale/no.json000066400000000000000000000011461301215300200204340ustar00rootroot00000000000000{ "connecting_ctrlport": "Kobler til Tors kontroll-port for å sette opp en gjemt tjeneste på port {0:d}.", "cant_connect_ctrlport": "Klarte ikke å koble til Tors kontroll-porter {0:s}. Sjekk at Tor kjører.", "give_this_url": "Gi personen du vil sende filen til denne URL-en:", "ctrlc_to_stop": "Trykk Ctrl+C for å stoppe serveren.", "not_a_file": "{0:s} er ikke en fil.", "gui_copied_url": "Kopierte URL-en til utklippstavlen", "download_page_loaded": "Nedlastingsside lastet", "other_page_loaded": "En annen side har blitt lastet", "close_on_finish": "Lukk automatisk" } onionshare-0.9.2/resources/locale/pt.json000066400000000000000000000012351301215300200204420ustar00rootroot00000000000000{ "connecting_ctrlport": "Conectando-se à porta de controle Tor para configurar serviço escondido na porta {0:d}.", "cant_connect_ctrlport": "Não pode conectar à porta de controle Tor na porta {0:s}. O Tor está rodando?", "give_this_url": "Passe este URL para a pessoa que deve receber o arquivo:", "ctrlc_to_stop": "Pressione Ctrl-C para parar o servidor", "not_a_file": "{0:s} não é um arquivo.", "gui_copied_url": "URL foi copiado para área de transferência", "download_page_loaded": "Página de download carregada", "other_page_loaded": "Outra página tem sido carregada", "close_on_finish": "Fechar automaticamente" } onionshare-0.9.2/resources/locale/ru.json000066400000000000000000000020061301215300200204420ustar00rootroot00000000000000{ "connecting_ctrlport": "Соединяемся с контрольным портом Tor для создания скрытого сервиса на порту {0:d}.", "cant_connect_ctrlport": "Невозможно соединиться с контрольным портом Tor на порту {0:s}. Tor запущен?", "give_this_url": "Отправьте эту ссылку тому человеку, которому вы хотите передать файл:", "ctrlc_to_stop": "Нажмите Ctrl-C чтобы остановить сервер", "not_a_file": "{0:s} не является файлом.", "gui_copied_url": "Ссылка скопирована в буфер обмена", "download_page_loaded": "Страница закачки загружена", "other_page_loaded": "Другая страница была загружена", "close_on_finish": "Закрыть автоматически", "gui_copy_url": "Скопировать ссылку" } onionshare-0.9.2/resources/locale/tr.json000066400000000000000000000055551301215300200204550ustar00rootroot00000000000000{ "connecting_ctrlport": "{0:d} portundaki gizli hizmet(GH) kurulumu için Tor kontrol portuna bağlanıyor.", "cant_connect_ctrlport": "Tor kontrol {0:s} portuna bağlanamıyor. OnionShare çalışması için arkaplanda Tor Browser çalışması gerekiyor. Tor Browser indirmediyseniz, https://www.torproject.org/", "cant_connect_socksport": "Tor SOCKS5 sunucu {0:s} portuna bağlanamıyor. OnionShare çalışması için arkaplanda Tor Browser çalışması gerekiyor. Tor Browser indirmediyseniz, https://www.torproject.org/", "preparing_files": "Paylaşmak için dosyalar hazırlanıyor.", "wait_for_hs": "GH hazır olması bekleniyor:", "wait_for_hs_trying": "Deneniyor...", "wait_for_hs_nope": "Henüz hazır değil.", "wait_for_hs_yup": "Hazır!", "give_this_url": "Dosyayı gönderdiğin kişiye bu URL'i verin:", "ctrlc_to_stop": "Sunucuyu durdurmak için, Ctrl-C basın", "not_a_file": "{0:s} dosya değil.", "download_page_loaded": "İndirme sayfası yüklendi", "other_page_loaded": "Diğer sayfa yüklendi", "close_on_finish": "Paylaşımı kendiliğinden durdur", "closing_automatically": "İndirme işlemi tamamlandığı için kendiliğinden durduruluyor", "large_filesize": "Uyarı: Büyük dosyaların gönderimi saatler sürebilir", "error_tails_invalid_port": "Geçersiz değer, port sayı olmalıdır", "error_tails_unknown_root": "Tails ana işlemi ile ilgili bilinmeyen hata", "help_tails_port": "Sadece Tails: port for opening firewall, starting onion service", "help_local_only": "Tor kullanmaya kalkışmayın: sadece geliştirme için", "help_stay_open": "İndirme tamamlandıktan sonra gizli hizmeti çalıştırmaya devam et", "help_transparent_torification": "Sistemim apaçık torlu", "help_debug": "Hata kayıtlarını diske kaydet", "help_filename": "Paylaşmak için dosya ve klasörler listesi", "gui_drag_and_drop": "Dosyaları buraya\n Sürükle ve Bırak", "gui_add_files": "Dosyalar Ekle", "gui_add_folder": "Klasör Ekle", "gui_delete": "Sil", "gui_choose_files": "Dosyalar Seç", "gui_choose_folder": "Klasör Seç", "gui_start_server": "Paylaşımı Başlat", "gui_stop_server": "Paylaşımı Durdur", "gui_copy_url": "URL Kopyala", "gui_downloads": "İndirilenler:", "gui_canceled": "İptal edilen", "gui_copied_url": "Panoya kopyalanan URL", "gui_starting_server1": "Tor gizli hizmeti başlatılıyor...", "gui_starting_server2": "Dosyalar hazırlanıyor...", "gui_starting_server3": "Tor gizli hizmeti bekleniyor...", "gui_please_wait": "Lütfen bekleyin...", "error_hs_dir_cannot_create": "Gizli hizmet klasörü {0:s} oluşturulamıyor", "error_hs_dir_not_writable": "Gizle hizmet klasörü {0:s} yazılabilir değil", "using_ephemeral": "Geçici Tor gizli hizmetine bakılıyor ve yayımı bekleniyor" } onionshare-0.9.2/resources/version.txt000066400000000000000000000000061301215300200201060ustar00rootroot000000000000000.9.2 onionshare-0.9.2/resources/wordlist.txt000066400000000000000000001105761301215300200203060ustar00rootroot00000000000000a aaron aba ababa aback abase abash abate abbas abbe abbey abbot abbott abc abe abed abel abet abide abject ablaze able abner abode abort about above abrade abram absorb abut abyss acadia accra accrue ace acetic ache acid acidic acm acme acorn acre acrid act acton actor acts acuity acute ada adage adagio adair adam adams adapt add added addis addle adele aden adept adieu adjust adler admit admix ado adobe adonis adopt adore adorn advent advert advise aegis aeneid afar affair affine affix afire afoot afraid afro aft again agate agave age agee agenda agent agile aging agnes agnew ago agone agony agree ague agway ahead ahem ahoy aid aida aide aides aiken ail aile aim ainu air aires airman airway airy aisle ajar ajax akers akin akron ala alai alamo alan alarm alaska alb alba album alcoa alden alder ale alec aleck aleph alert alex alexei alga algae algal alger algol ali alia alias alibi alice alien alight align alike alive all allan allay allen alley allied allis allot allow alloy allure ally allyl allyn alma almost aloe aloft aloha alone along aloof aloud alp alpha alps also alsop altair altar alter alto alton alum alumni alva alvin alway ama amass amaze amber amble ambush amen amend ames ami amid amide amigo amino amiss amity amman ammo amoco amok among amort amos amp ampere ampex ample amply amra amulet amuse amy ana and andes andre andrew andy anent anew angel angelo anger angle anglo angola angst angus ani anion anise anita ankle ann anna annal anne annex annie annoy annul annuli annum anode ansi answer ant ante anti antic anton anvil any anyhow anyway aok aorta apart apathy ape apex aphid aplomb appeal append apple apply april apron apse apt aqua araby arc arcana arch archer arden ardent are area arena ares argive argo argon argot argue argus arhat arid aries arise ark arlen arlene arm armco army arnold aroma arose arpa array arrear arrow arson art artery arthur artie arty aruba arum aryl ascend ash ashen asher ashley ashy asia aside ask askew asleep aspen aspire assai assam assay asset assort assure aster astm astor astral ate athens atlas atom atomic atone atop attic attire aubrey audio audit aug auger augur august auk aunt aura aural auric austin auto autumn avail ave aver avert avery aviate avid avis aviv avoid avon avow await awake award aware awash away awe awful awl awn awoke awry axe axes axial axiom axis axle axon aye ayers aztec azure b babel baby bach back backup bacon bad bade baden badge baffle bag baggy bah bahama bail baird bait bake baku bald baldy bale bali balk balkan balky ball balled ballot balm balmy balsa bam bambi ban banal band bandit bandy bane bang banish banjo bank banks bantu bar barb bard bare barfly barge bark barley barn barnes baron barony barr barre barry barter barth barton basal base basel bash basic basil basin basis bask bass bassi basso baste bat batch bate bater bates bath bathe batik baton bator batt bauble baud bauer bawd bawdy bawl baxter bay bayda bayed bayou bazaar bcd beach bead beady beak beam bean bear beard beat beau beauty beaux bebop becalm beck becker becky bed bedim bee beebe beech beef beefy been beep beer beet befall befit befog beg began beget beggar begin begun behind beige being beirut bel bela belch belfry belie bell bella belle belly below belt bema beman bemoan ben bench bend bender benny bent benz berea bereft beret berg berlin bern berne bernet berra berry bert berth beryl beset bess bessel best bestir bet beta betel beth bethel betsy bette betty bevel bevy beware bey bezel bhoy bias bib bibb bicep biceps bid biddy bide bien big biggs bigot bile bilge bilk bill billow billy bin binary bind bing binge bingle bini biota birch bird birdie birth bison bisque bit bite bitt bitten biz bizet blab blade blair blake blame blanc bland blank blare blast blat blatz blaze bleak bleat bled bleed blend bless blest blew blimp blink blinn blip bliss blithe blitz bloat blob bloc bloch block bloke blond blonde blood bloom bloop blot blotch blown blue bluet bluff blum blunt blur blurt blush blvd blythe bmw boa boar board boast boat bob bobbin bobby bobcat boca bock bode body bog bogey boggy bogus bogy bohr boil bois boise bold bole bolo bolt bombay bon bona bond bone bongo bonn bonus bony bonze boo boogie book booky boon boone boor boost boot booth booze bop borax border bore borg boric boris born borne borneo boron bosch bose bosom boson boss boston botch both bottle bough bouncy bound bourn bout bovine bow bowel bowen bowie bowl box boxy boy boyar boyce boyd boyle brace bract brad brady brae brag bragg braid brain brainy brake bran brand brandt brant brash brass brassy braun brave bravo brawl bray bread break bream breath bred breed breeze bremen brent brest brett breve brew brian briar bribe brice brick bride brief brig briggs brim brine bring brink briny brisk broad brock broil broke broken bronx brood brook brooke broom broth brow brown browse bruce bruit brunch bruno brunt brush brute bryan bryant bryce bryn bstj btl bub buck bud budd buddy budge buena buenos buff bug buggy bugle buick build built bulb bulge bulk bulky bull bully bump bun bunch bundy bunk bunny bunt bunyan buoy burch bureau buret burg burke burl burly burma burnt burp burr burro burst burt burton burtt bury bus busch bush bushel bushy buss bust busy but butane butch buteo butte butyl buxom buy buyer buzz buzzy bye byers bylaw byline byrd byrne byron byte byway byword c cab cabal cabin cable cabot cacao cache cacm cacti caddy cadent cadet cadre cady cafe cage cagey cahill caiman cain caine cairn cairo cake cal calder caleb calf call calla callus calm calve cam camber came camel cameo camp can canal canary candle candy cane canis canna cannot canny canoe canon canopy cant canto canton cap cape caper capo car carbon card care caress caret carey cargo carib carl carla carlo carne carob carol carp carpet carr carrie carry carson cart carte caruso carve case casey cash cashew cask casket cast caste cat catch cater cathy catkin catsup cauchy caulk cause cave cavern cavil cavort caw cayuga cbs cdc cease cecil cedar cede ceil celia cell census cent ceres cern cetera cetus chad chafe chaff chai chain chair chalk champ chance chang chant chao chaos chap chapel char chard charm chart chase chasm chaste chat chaw cheap cheat check cheek cheeky cheer chef chen chert cherub chess chest chevy chew chi chic chick chide chief child chile chili chill chilly chime china chine chip chirp chisel chit chive chock choir choke chomp chop chopin choral chord chore chose chosen chou chow chris chub chuck chuff chug chum chump chunk churn chute cia cicada cider cigar cilia cinch cindy cipher circa circe cite citrus city civet civic civil clad claim clam clammy clamp clan clang clank clap clara clare clark clarke clash clasp class claus clause claw clay clean clear cleat cleft clerk cliche click cliff climb clime cling clink clint clio clip clive cloak clock clod clog clomp clone close closet clot cloth cloud clout clove clown cloy club cluck clue cluj clump clumsy clung clyde coach coal coast coat coax cobb cobble cobol cobra coca cockle coco cocoa cod coda coddle code codon cody coed cog cogent cohen cohn coil coin coke col cola colby cold cole colon colony colt colza coma comb combat come comet cometh comic comma con conch cone coney congo conic conn conner conway cony coo cook cooke cooky cool cooley coop coors coot cop cope copra copy coral corbel cord core corey cork corn corny corp corps corvus cos cosec coset cosh cost costa cosy cot cotta cotty couch cough could count coup coupe court cousin cove coven cover covet cow cowan cowl cowman cowry cox coy coyote coypu cozen cozy cpa crab craft crag craig cram cramp crane crank crass crate crater crave craw crawl craze crazy creak cream credit credo creed creek creep creole creon crepe crept cress crest crete crew crib cried crimp crisp criss croak crock crocus croft croix crone crony crook croon crop cross crow crowd crown crt crud crude cruel crumb crump crush crust crux cruz cry crypt cub cuba cube cubic cud cuddle cue cuff cull culpa cult cumin cuny cup cupful cupid cur curb curd cure curfew curia curie curio curl curry curse curt curve cusp cut cute cutlet cycad cycle cynic cyril cyrus cyst czar czech d dab dacca dactyl dad dada daddy dade daffy dahl dahlia dairy dais daisy dakar dale daley dally daly dam dame damon damp damsel dan dana dance dandy dane dang dank danny dante dar dare dark darken darn darry dart dash data date dater datum daub daunt dave david davis davit davy dawn dawson day daze deacon deaf deal dealt dean deane dear debar debby debit debra debris debt debug debut dec decal decay decca deck decker decor decree decry dee deed deem deep deer deere def defer deform deft defy degas degum deify deign deity deja del delay delft delhi delia dell della delta delve demark demit demur den deneb denial denny dense dent denton deny depot depth depute derby derek des desist desk detach deter deuce deus devoid devon dew dewar dewey dewy dey dhabi dial diana diane diary dibble dice dicta did dido diego diem diesel diet diety dietz dig digit dilate dill dim dime din dinah dine ding dingo dingy dint diode dip dirac dire dirge dirt dis disc dish disk disney ditch ditto ditty diva divan dixie dixon dizzy dna dobbs dobson dock docket dod dodd dodge dodo doe doff dog doge dogma dolan dolce dole doll dolly dolt dome don done doneck donna donor door dora doria doric doris dose dot dote double doubt douce doug dough dour douse dove dow dowel down downs dowry doyle doze dozen drab draco draft drag drain drake dram drama drank drape draw drawl drawn dread dream dreamy dreg dress dressy drew drib dried drier drift drill drink drip drive droll drone drool droop drop dross drove drown drub druid drum drury dry dryad dual duane dub dubhe dublin ducat duck duct dud due duel duet duff duffy dug dugan duke dull dully dulse duly duma dummy dump dumpy dun dunce dune dung dunham dunk dunlop dunn dupe durer dusk dusky dust dusty dutch duty dwarf dwell dwelt dwight dwyer dyad dye dyer dying dylan dyne e each eagan eager eagle ear earl earn earth ease easel east easy eat eaten eater eaton eave ebb eben ebony echo eclat ecole eddie eddy eden edgar edge edgy edict edify edit edith editor edna edt edwin eel eeoc eerie efface effie efg eft egan egg ego egress egret egypt eider eight eire eject eke elan elate elba elbow elder eldon elect elegy elena eleven elfin elgin eli elide eliot elite elk ell ella ellen ellis elm elmer elope else elsie elton elude elute elves ely embalm embark embed ember emcee emery emil emile emily emit emma emory empty enact enamel end endow eng engel engle engulf enid enjoy enmity enoch enol enos enrico ensue enter entrap entry envoy envy epa epic epoch epoxy epsom equal equip era erase erato erda ere erg eric erich erie erik ernest ernie ernst erode eros err errand errol error erupt ervin erwin essay essen essex est ester estes estop eta etc etch ethan ethel ether ethic ethos ethyl etude eucre euler eureka eva evade evans eve even event every evict evil evoke evolve ewe ewing exact exalt exam excel excess exert exile exist exit exodus expel extant extent extol extra exude exult exxon eye eyed ezra f faa faber fable face facet facile fact facto fad fade faery fahey fail fain faint fair fake fall false fame fan fancy fang fanny fanout far farad farce fare fargo farley farm faro fast fatal fate fatty fault faun fauna faust fawn fay faze fbi fcc fda feast feat feb fed fee feed feel feet feign feint felice felix fell felon felt femur fence fend fermi fern ferric ferry fest fetal fetch fete fetid fetus feud fever few fgh fiat fib fibrin fiche fide fief field fiend fiery fife fifo fifth fifty fig filch file filet fill filler filly film filmy filth fin final finale finch find fine finite fink finn finny fir firm first fish fishy fisk fiske fist fit fitch five fix fjord flack flag flail flair flak flake flaky flam flame flank flap flare flash flask flat flatus flaw flax flea fleck fled flee fleet flesh flew flex flick flier flinch fling flint flip flirt flit flo float floc flock floe flog flood floor flop floppy flora flour flout flow flown floyd flu flub flue fluff fluid fluke flung flush flute flux fly flyer flynn fmc foal foam foamy fob focal foci focus fodder foe fog foggy fogy foil foist fold foley folio folk folly fond font food fool foot foote fop for foray force ford forge forgot fork form fort forte forth forty forum foss fossil foul found fount four fovea fowl fox foxy foyer fpc frail frame fran franc franca frank franz frau fray freak fred free freed freer frenzy freon fresh fret freud frey freya friar frick fried frill frilly frisky fritz fro frock frog from front frost froth frown froze fruit fry frye ftc fuchs fudge fuel fugal fugue fuji full fully fum fume fun fund fungal fungi funk funny fur furl furry fury furze fuse fuss fussy fusty fuzz fuzzy g gab gable gabon gad gadget gaff gaffe gag gage gail gain gait gal gala galaxy gale galen gall gallop galt gam game gamin gamma gamut gander gang gao gap gape gar garb garish garner garry garth gary gas gash gasp gassy gate gates gator gauche gaudy gauge gaul gaunt gaur gauss gauze gave gavel gavin gawk gawky gaze gear gecko gee geese geigy gel geld gem gemma gene genie genii genoa genre gent gentry genus gerbil germ gerry get getty ghana ghent ghetto ghi ghost ghoul giant gibbs gibby gibe giddy gift gig gil gila gild giles gill gilt gimbal gimpy gina ginn gino gird girl girth gist give given glad gladdy glade glamor gland glans glare glass glaze gleam glean glee glen glenn glib glide glint gloat glob globe glom gloom glory gloss glove glow glue glued gluey gluing glum glut glyph gmt gnarl gnash gnat gnaw gnome gnp gnu goa goad goal goat goer goes goff gog goggle gogh gogo gold golf golly gone gong goo good goode goody goof goofy goose gop gordon gore goren gorge gorky gorse gory gosh gospel got gouda gouge gould gourd gout gown gpo grab grace grad grade grady graff graft grail grain grand grant grape graph grasp grass grata grate grater grave gravy gray graze great grebe greed greedy greek green greer greet greg gregg greta grew grey grid grief grieve grill grim grime grimm grin grind grip gripe grist grit groan groat groin groom grope groton group grout grove grow growl grown grub gruff grunt gsa guam guano guard guess guest guide guild guile guilt guise guitar gules gulf gull gully gulp gum gumbo gummy gunk gunky gunny gurgle guru gus gush gust gusto gusty gut gutsy guy guyana gwen gwyn gym gypsy gyro h haag haas habib habit hack had hades hadron hagen hager hague hahn haifa haiku hail hair hairy haiti hal hale haley half hall halma halo halt halvah halve ham hamal hamlin han hand handy haney hang hank hanna hanoi hans hansel hap happy hard hardy hare hark harley harm harp harpy harry harsh hart harvey hash hasp hast haste hasty hat hatch hate hater hath hatred haul haunt have haven havoc haw hawk hay haydn hayes hays hazard haze hazel hazy head heady heal healy heap hear heard heart heat heath heave heavy hebrew heck heckle hedge heed heel heft hefty heigh heine heinz heir held helen helga helix hello helm helmut help hem hemp hen hence henri henry her hera herb herd here hero heroic heron herr hertz hess hesse hettie hetty hew hewitt hewn hex hey hiatt hick hicks hid hide high hij hike hill hilly hilt hilum him hind hindu hines hinge hint hip hippo hippy hiram hire hirsch his hiss hit hitch hive hoagy hoar hoard hob hobbs hobby hoc hock hodge hodges hoe hoff hog hogan hoi hokan hold holdup holly holm holst holt home honda hondo hone honey hong hooch hood hoof hookup hoop hoot hop hope horde horse horus hose host hot hotbox hotel hough hound hour house hove hovel hover how howdy howe howl hoy hoyt hub hubbub hubby huber huck hue hued huff hug huge hugh hughes hugo huh hulk hull hum human humid hump humus hun hunch hung hunk hunt hurd hurl huron hurrah hurry hurst hurt hurty hush hut hutch hyde hydra hydro hyena hying hyman hymn hymnal i iambic ian ibex ibid ibis ibm ibn icc ice icing icky icon icy ida idaho idea ideal idiom idle idol idyll ieee iffy ifni igloo igor ijk ike ileum iliac iliad ill illume ilona image imbue imp impel import impute inane inapt inc inca inch incur index india indies indy inept inert infect infer infima infix infra ingot inhere injun ink inlay inlet inman inn inner input insect inset insult intend inter into inure invoke ion ionic iota iowa ipso ira iran iraq irate ire irene iris irish irk irma iron irony irs irvin irwin isaac isabel ising isis islam island isle issue italy item ito itt ivan ive ivory ivy j jab jack jacky jacm jacob jacobi jag jail jaime jake jam james jan jane janet janos janus japan jar jason java jaw jay jazz jazzy jean jed jeep jeff jejune jelly jenny jeres jerky jerry jersey jess jesse jest jet jewel jewett jibe jiffy jig jill jilt jim jimmy jinx jive jkl joan job jock jockey joe joel joey jog john johns join joke jolla jolly jolt jon jonas jones jorge jose josef joshua joss jostle jot joule joust jove jowl jowly joy joyce juan judas judd jude judge judo judy jug juggle juice juicy juju juke jukes julep jules julia julie julio july jumbo jump jumpy junco june junk junky juno junta jura jure juror jury just jut jute k kabul kafka kahn kajar kale kalmia kane kant kapok kappa karate karen karl karma karol karp kate kathy katie katz kava kay kayo kazoo keats keel keen keep keg keith keller kelly kelp kemp ken keno kent kenya kepler kept kern kerr kerry ketch kevin key keyed keyes keys khaki khan khmer kick kidde kidney kiev kigali kim kin kind king kiosk kiowa kirby kirk kirov kiss kit kite kitty kiva kivu kiwi klan klaus klein kline klm klux knack knapp knauer knead knee kneel knelt knew knick knit knob knock knoll knot knott know known knox knurl koala koch kodak kola kombu kong koran korea kraft krause krebs kruse kudo kudzu kuhn kulak kurd kurt kyle kyoto l lab laban label labile lac lace lack lacy lad laden ladle lady lag lager lagoon lagos lain lair laity lake lam lamar lamb lame lamp lana lance land lane lang lange lanka lanky lao laos lap lapel lapse larch lard lares large lark larkin larry lars larva lase lash lass lasso last latch late later latest latex lath lathe latus laud laue laugh launch laura lava law lawn lawson lax lay layup laze lazy lea leach lead leaf leafy leak leaky lean leap leapt lear learn lease leash least leave led ledge lee leech leeds leek leer leery leeway left lefty leg legal leggy legion leigh leila leland lemma lemon len lena lend lenin lenny lens lent leo leon leona leone leper leroy less lessee lest let lethe lev levee level lever levi levin levis levy lew lewd lewis leyden liar libel libya lice lick lid lie lied lien lieu life lifo lift light like liken lila lilac lilly lilt lily lima limb limbo lime limit limp lin lind linda linden line linen lingo link lint linus lion lip lipid lisa lise lisle lisp list listen lit lithe litton live liven livid livre liz lizzie lloyd lmn load loaf loam loamy loan loath lob lobar lobby lobe lobo local loci lock locke locus lodge loeb loess loft lofty log logan loge logic loin loire lois loiter loki lola loll lolly lomb lome lone long look loom loon loop loose loot lop lope lopez lord lore loren los lose loss lossy lost lot lotte lotus lou loud louis louise louse lousy louver love low lowe lower lowry loy loyal lsi ltv lucas lucia lucid luck lucky lucre lucy lug luge luger luis luke lull lulu lumbar lumen lump lumpy lunar lunch lund lung lunge lura lurch lure lurid lurk lush lust lusty lute lutz lux luxe luzon lydia lye lying lykes lyle lyman lymph lynn lynx lyon lyons lyra lyric m mabel mac mace mach macho mack mackey macon macro madam made madman madsen mae magi magic magma magna magog maid maier mail maim main maine major make malady malay male mali mall malt malta mambo mamma mammal man mana manama mane mange mania manic mann manna manor mans manse mantle many mao maori map maple mar marc march marco marcy mardi mare margo maria marie marin marine mario mark marks marlin marrow marry mars marsh mart marty marx mary maser mash mask mason masque mass mast mat match mate mateo mater math matte maul mauve mavis maw mawr max maxim maxima may maya maybe mayer mayhem mayo mayor mayst mazda maze mba mccoy mcgee mckay mckee mcleod mead meal mealy mean meant meat meaty mecca mecum medal medea media medic medley meek meet meg mega meier meir mel meld melee mellow melon melt memo memoir men mend menlo menu merck mercy mere merge merit merle merry mesa mescal mesh meson mess messy met metal mete meter metro mew meyer meyers mezzo miami mica mice mickey micky micro mid midas midge midst mien miff mig might mike mila milan milch mild mildew mile miles milk milky mill mills milt mimi mimic mince mind mine mini minim mink minnow minor minos minot minsk mint minus mira mirage mire mirth miser misery miss missy mist misty mit mite mitre mitt mix mixup mizar mno moan moat mob mobil mock modal mode model modem modish moe moen mohr moire moist molal molar mold mole moll mollie molly molt molten mommy mona monad mondo monel money monic monk mont monte month monty moo mood moody moon moor moore moose moot mop moral morale moran more morel morn morse morsel mort mosaic moser moses moss mossy most mot motel motet moth mother motif motor motto mould mound mount mourn mouse mousy mouth move movie mow moyer mph mrs much muck mucus mud mudd muddy muffin mug muggy mugho muir mulch mulct mule mull multi mum mummy munch mung munson muon muong mural muriel murk murky murre muse mush mushy music musk must musty mute mutt muzak muzo myel myers mylar mynah myopia myra myron myrrh myself myth n naacp nab nadir nag nagoya nagy naiad nail nair naive name nan nancy naomi nap nary nasa nasal nash nat natal nate nato natty nature naval nave navel navy nay nbc nbs ncaa ncr neal near neat neath neck ned nee need needy neff negate nehru neil nell nelsen neon nepal nero nerve ness nest net neuron neva neve new newel newt next nib nibs nice nicety niche nick niece nigh night nih nikko nil nile nimbus nimh nina nine ninth niobe nit nitric nitty nixon noaa noah nob nobel noble nod nodal node noel noise noisy nolan noll nolo nomad non nonce none noon noose nop nor nora norm norma north norway nose not notch note notre noun nov nova novak novel novo now nrc nsf ntis nuance nubia nuclei nudge null numb nun nurse nut nyc nylon nyu o oaf oak oaken oakley oar oases oasis oat oath obese obey objet oboe occur ocean oct octal octave octet odd ode odin odium off offal offend offer oft often ogden ogle ogre ohio ohm ohmic oil oily oint okay olaf olav old olden oldy olga olin olive olsen olson omaha oman omega omen omit once one onion only onset onto onus onward onyx ooze opal opec opel open opera opium opt optic opus orate orb orbit orchid ordain order ore organ orin orion ornery orono orr osaka oscar osier oslo other otis ott otter otto ouch ought ounce our oust out ouvre ouzel ouzo ova oval ovary ovate oven over overt ovid owe owens owing owl owly own oxen oxeye oxide oxnard ozark ozone p pablo pabst pace pack packet pact pad paddy padre paean pagan page paid pail pain paine paint pair pal pale pall palm palo palsy pam pampa pan panama panda pane panel pang panic pant panty paoli pap papa papal papaw paper pappy papua par parch pardon pare pareto paris park parke parks parr parry parse part party pascal pasha paso pass passe past paste pasty pat patch pate pater path patio patsy patti patton patty paul paula pauli paulo pause pave paw pawn pax pay payday payne paz pbs pea peace peach peak peaky peal peale pear pearl pease peat pebble pecan pecos pedal pedro peed peek peel peep peepy peer peg peggy pelt pen penal pence pencil pend penh penn penna penny pent peony pep peppy pepsi per perch percy perez peril perk perky perle perry persia pert perth peru peruse pest peste pet petal pete peter petit petri petty pew pewee phage phase phd phenol phi phil phlox phon phone phony photo phyla physic piano pica pick pickup picky pie piece pier pierce piety pig piggy pike pile pill pilot pin pinch pine ping pinion pink pint pinto pion piotr pious pip pipe piper pique pit pitch pith pithy pitney pitt pity pius pivot pixel pizza place plague plaid plain plan plane plank plant plasm plat plate plato play playa plaza plea plead pleat pledge pliny plod plop plot plow pluck plug plum plumb plume plump plunk plus plush plushy pluto ply poach pobox pod podge podia poe poem poesy poet poetry pogo poi point poise poke pol polar pole police polio polis polk polka poll polo pomona pomp ponce pond pong pont pony pooch pooh pool poole poor pop pope poppy porch pore pork porous port porte portia porto pose posey posh posit posse post posy potts pouch pound pour pout pow powder power ppm pqr prado pram prank pratt pray preen prefix prep press prexy prey priam price pride prig prim prima prime primp prince print prior prism prissy privy prize pro probe prod prof prom prone prong proof prop propyl prose proud prove prow prowl proxy prune pry psalm psi psych pta pub puck puddly puerto puff puffy pug pugh pull pulp pulse puma pump pun punch punic punish punk punky punt puny pup pupal pupil puppy pure purge purl purr purse pus pusan pusey push put putt putty pvc pygmy pyle pyre pyrex pyrite q qatar qed qrs qua quack quad quaff quail quake qualm quark quarry quart quash quasi quay queasy queen quell query quest queue quick quid quiet quill quilt quinn quint quip quirk quirt quit quite quito quiz quo quod quota quote r rabat rabbit rabid rabin race rack racy radar radii radio radium radix radon rae rafael raft rag rage raid rail rain rainy raise raj rajah rake rally ralph ram raman ramo ramp ramsey ran ranch rand rang range rangy rank rant raoul rap rapid rapt rare rasa rascal rash rasp rat rata rate rater ratio rattle raul rave ravel raven raw ray raze razor rca reach read ready reagan real realm ream reap rear reave reb rebel rebut recipe reck recur red redeem reduce reed reedy reef reek reel reese reeve refer regal regina regis reich reid reign rein relax relay relic reman remedy remit remus rena renal rend rene renown rent rep repel repent resin resort rest ret retch return reub rev reveal revel rever revet revved rex rhea rheum rhine rhino rho rhoda rhode rhyme rib rica rice rich rick rico rid ride ridge rifle rift rig riga rigel riggs right rigid riley rill rilly rim rime rimy ring rink rinse rio riot rip ripe ripen ripley rise risen risk risky rite ritz rival riven river rivet riyadh road roam roar roast rob robe robin robot rock rocket rocky rod rode rodeo roe roger rogue roil role roll roman rome romeo romp ron rondo rood roof rook rookie rooky room roomy roost root rope rosa rose rosen ross rosy rot rotc roth rotor rouge rough round rouse rout route rove row rowdy rowe roy royal royce rpm rst rsvp ruanda rub rube ruben rubin rubric ruby ruddy rude rudy rue rufus rug ruin rule rum rumen rummy rumpus run rune rung runge runic runt runty rupee rural ruse rush rusk russ russo rust rusty rut ruth rutty ryan ryder rye s sabine sable sabra sac sachs sack sad saddle sadie safari safe sag saga sage sago said sail saint sake sal salad sale salem saline salk salle sally salon salt salty salve salvo sam samba same sammy samoa samuel san sana sand sandal sandy sane sang sank sans santa santo sao sap sappy sara sarah saran sari sash sat satin satyr sauce saucy saud saudi saul sault saute save savoy savvy saw sawyer sax saxon say scab scala scald scale scalp scam scamp scan scant scar scare scarf scary scaup scene scent school scion scm scoff scold scoop scoot scope scops score scoria scorn scot scott scour scout scowl scram scrap scrape scrim scrub scuba scud scuff scull scurry sea seal seam seamy sean sear sears season seat sec secant sect sedan seder sedge see seed seedy seek seem seen seep seethe seize self sell selma semi sen send seneca senor sense sent sentry seoul sepal sepia sepoy sept septa sequin sera serf serge serif serum serve servo set seth seton setup seven sever severe sew sewn shack shad shade shady shafer shaft shah shake shaken shako shaky shale shall sham shame shank shape shard share shari shark sharp shave shaw shawl shay she shea sheaf shear sheath shed sheen sheep sheer sheet sheik shelf shell shied shift shill shim shin shine shinto shiny ship shire shirk shirt shish shiv shoal shock shod shoe shoji shone shoo shook shop shore short shot shout shove show shown showy shrank shred shrew shrike shrub shrug shu shuck shun shunt shut shy sial siam sian sib sibley sibyl sic side sidle siege siena sieve sift sigh sight sigma sign signal signor silas silk silky sill silly silo silt silty sima simon simons sims sin sinai since sine sinew sing singe sinh sink sinus sioux sip sir sire siren sis sisal sit site situ situs siva six sixgun sixth sixty size skat skate skeet skew ski skid skied skiff skill skim skimp skimpy skin skip skirt skit skulk skull skunk sky skye slab slack slag slain slake slam slang slap slash slat slate slater slay sled sleek sleep sleet slept slew slice slick slid slide slim slimy sling slip slit sliver sloan slob sloe slog sloop slop slope slosh slot sloth slow slug sluice slum slump slung slur slurp sly small smart smash smear smell smelt smile smirk smith smithy smog smoke smoky smug snack snafu snag snail snake snap snare snark snarl sneak sneer snell snick sniff snip snipe snob snook snoop snore snort snout snow snowy snub snuff snug soak soap soapy soar sober social sock sod soda sofa sofia soft soften soggy soil sol solar sold sole solemn solid solo solon solve soma somal some son sonar song sonic sonny sonora sony soon soot sooth sop sora sorb sore sorry sort sou sough soul sound soup sour source sousa south sow sown soy soya spa space spade spain span spar spare sparge spark spasm spat spate spawn spay speak spear spec speck sped speed spell spend spent sperry spew spica spice spicy spike spiky spill spilt spin spine spiny spire spiro spite spitz splat splay spline split spoil spoke spoof spook spooky spool spoon spore sport spot spout sprain spray spree sprig spruce sprue spud spume spun spur spurn spurt spy squad squat squibb squid squint sri sst stab stack stacy staff stag stage stagy stahl staid stain stair stake stale stalk stall stamp stan stance stand stank staph star stare stark starr start stash state statue stave stay stead steak steal steam steed steel steele steen steep steer stein stella stem step stern steve stew stick stiff stile still stilt sting stingy stink stint stir stock stoic stoke stole stomp stone stony stood stool stoop stop store storey stork storm story stout stove stow strafe strap straw stray strewn strip stroll strom strop strum strut stu stuart stub stuck stud study stuff stuffy stump stun stung stunk stunt sturm style styli styx suave sub subtly such sud sudan suds sue suey suez sugar suit suite sulfa sulk sulky sully sultry sum sumac summon sun sung sunk sunny sunset suny sup super supra sure surf surge sus susan sushi susie sutton swab swag swain swam swami swamp swampy swan swank swap swarm swart swat swath sway swear sweat sweaty swede sweep sweet swell swelt swept swift swig swim swine swing swipe swirl swish swiss swoop sword swore sworn swum swung sybil sykes sylow sylvan synge synod syria syrup t tab table tabu tabula tacit tack tacky tacoma tact tad taffy taft tag tahoe tail taint take taken talc tale talk talky tall tallow tally talon talus tam tame tamp tampa tan tango tangy tanh tank tansy tanya tao taos tap tapa tape taper tapir tapis tappa tar tara tardy tariff tarry tart task tass taste tasty tat tate tater tattle tatty tau taunt taut tavern tawny tax taxi tea teach teal team tear tease tech tecum ted teddy tee teem teen teensy teet teeth telex tell tempo tempt ten tend tenet tenney tenon tenor tense tensor tent tenth tepee tepid term tern terra terre terry terse tess test testy tete texan texas text thai than thank that thaw the thea thee theft their them theme then there these theta they thick thief thigh thin thine thing think third this thong thor thorn thorny those thou thread three threw throb throes throw thrum thud thug thule thumb thump thus thy thyme tiber tibet tibia tic tick ticket tid tidal tidbit tide tidy tie tied tier tift tiger tight til tilde tile till tilt tilth tim time timex timid timon tin tina tine tinge tint tiny tioga tip tipoff tippy tipsy tire titan tithe title titus toad toady toast toby today todd toe tofu tog togo togs toil token tokyo told toll tom tomb tome tommy ton tonal tone tong toni tonic tonk tonsil tony too took tool toot tooth top topaz topic topple topsy tor torah torch tore tori torn torr torso tort torus tory toss tot total tote totem touch tough tour tout tow towel tower town toxic toxin toy trace track tract tracy trade trag trail train trait tram trap trash trawl tray tread treat treble tree trek trench trend tress triad trial tribe trick tried trig trill trim trio trip tripe trite triton trod troll troop trot trout troy truce truck trudge trudy true truly trump trunk truss trust truth trw try tsar ttl tty tub tuba tube tuck tudor tuff tuft tug tulane tulip tulle tulsa tum tun tuna tune tung tunic tunis tunnel tuple turf turin turk turn turvy tusk tussle tutor tutu tuv tva twa twain tweak tweed twice twig twill twin twine twirl twist twisty twit two twx tyburn tying tyler type typic typo tyson u ucla ugh ugly ulan ulcer ultra umber umbra umpire unary uncle under unify union unit unite unity unix until upend uphold upon upper uproar upset uptake upton urban urbane urea urge uri uris urn ursa usa usaf usage usc usda use useful usgs usher usia usn usps ussr usual usurp usury utah utica utile utmost utter uvw v vacua vacuo vade vaduz vague vail vain vale valet valeur valid value valve vamp van vance vane vary vase vast vat vault veal veda vee veer veery vega veil vein velar veldt vella vellum venal vend venial venom vent venus vera verb verde verdi verge verity verna verne versa verse verve very vessel vest vet vetch veto vex via vial vicar vice vichy vicky vida video vie viet view vigil vii viii vile villa vine vinyl viola violet virgil virgo virus vis visa vise visit visor vista vita vitae vital vito vitro viva vivian vivid vivo vixen viz vocal vogel vogue voice void volt volta volvo von voss vote vouch vow vowel vulcan vying w waals wac wack wacke wacky waco wad wade wadi wafer wag wage waggle wah wahl wail waist wait waite waive wake waken waldo wale walk walkie wall walls wally walsh walt walton waltz wan wand wane wang want war ward ware warm warmth warn warp warren wart warty wary was wash washy wasp wast waste watch water watt watts wave wavy wax waxen waxy way wayne weak weal wealth wean wear weary weave web webb weber weco wed wedge wee weed weedy week weeks weep wehr wei weigh weir weird weiss welch weld well wells welsh welt wendy went wept were wert west wet whack whale wham wharf what wheat whee wheel whelk whelm whelp when where whet which whiff whig while whim whine whinny whip whir whirl whisk white who whoa whole whom whoop whoosh whose whup why wick wide widen widow width wield wier wife wig wild wile wiley wilkes will willa wills wilma wilt wily win wince winch wind windy wine wing wink winnie wino winter winy wipe wire wiry wise wish wishy wisp wispy wit witch with withe withy witt witty wive woe wok woke wold wolf wolfe wolff wolve woman womb women won wonder wong wont woo wood woods woody wool woozy word wordy wore work world worm wormy worn worry worse worst worth wotan would wound wove woven wow wrack wrap wrath wreak wreck wrest wring wrist writ write writhe wrong wrote wry wuhan wxy wyatt wyeth wylie wyman wyner wynn x xenon xerox xylem xyz y yacht yah yak yale yalta yam yamaha yang yank yap yaqui yard yarn yates yaw yawl yawn yea yeah year yearn yeast yeasty yeats yell yelp yemen yen yet yield yin yip ymca yodel yoder yoga yogi yoke yokel yolk yon yond yore york yost you young your youth yow yucca yuck yuh yuki yukon yule yves ywca z zag zaire zan zap zazen zeal zealot zebra zeiss zen zero zest zesty zeta zeus zig zilch zinc zing zion zip zloty zoe zomba zone zoo zoom zorn zurich 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 111 123 200 222 234 300 333 345 400 444 456 500 555 567 600 666 678 700 777 789 800 888 900 999 1000 1111 1234 1492 1500 1600 1700 1776 1800 1812 1900 1910 1920 1925 1930 1935 1940 1945 1950 1955 1960 1965 1970 1975 1980 1985 1990 1991 1992 1993 1994 1995 1996 1997 2000 2001 2020 2222 2345 2468 3000 3333 3456 4000 4321 4444 4567 5000 5555 5678 6000 6666 6789 7000 7777 8000 8888 9000 9876 9999 100th 101st 10th 11th 12th 13th 14th 15th 16th 17th 18th 19th 1st 20th 21st 22nd 23rd 24th 25th 26th 27th 28th 29th 2nd 30th 31st 32nd 33rd 34th 35th 36th 37th 38th 39th 3rd 40th 41st 42nd 43rd 44th 45th 46th 47th 48th 49th 4th 50th 51st 52nd 53rd 54th 55th 56th 57th 58th 59th 5th 60th 61st 62nd 63rd 65th 66th 67th 68th 69th 6th 70th 71st 72nd 73rd 74th 75th 76th 77th 78th 79th 7th 80th 81st 82nd 83rd 84th 85th 86th 87th 88th 89th 8th 90th 91st 92nd 93rd 94th 95th 96th 97th 98th 99th 9th onionshare-0.9.2/screenshots/000077500000000000000000000000001301215300200162125ustar00rootroot00000000000000onionshare-0.9.2/screenshots/appdata-client.png000066400000000000000000002530061301215300200216140ustar00rootroot00000000000000PNG  IHDR@ pHYs  tIME :O IDATx}wṶ{e7ln*$%D+XA(`)X@D)(*{5 RIHn6-3v93sn !;̙3g|yN a!YFi%h4=> ݤ@1' b?#qgf'"_1N st;ۮLaF`UnI72)0) s]ɭIĝ(8˓E[o_J Ba/Gbp"'7q:=!s6dJKhu{pnĐ;jA.n|h>Tam9|RZ"DuG֫48$=#޷?"?\Ϡ7Ց5"UgHA$΢vfdn 3ۉ߿cW _8n${0[M}6oH=&#uaH!smk |Uȡ!y`Sȸ ! }"gkqB(<a>ޕ[("CIs6҉m;7Ad.NVߛdHljق,E "=y+W>Dbh/z.\7glۍD$EHD}ٱ9KO~П!HDxZ< [(x y} !GΡ|O?I8!px̐)ƻsK|G&ߕ|4'vDy$P|v :@9nC{ A| mIΕ-~p:e^[~G!E@EdZC@: *qD0+B>X*wr8<h5X5BLBM߬F܁dK_~,G! "pl=XZ+a,>°c,ŸY#eS{s`,RQ{!DX&Hyy|ΐ)s˜&7|I>Bux7(VFN![(lBNm$'LQɾoW yCa;FRPQ1G.R|hbJ #X[A"x GH8ɜD?)" */(ep?0&f!!ZDiSyg51&CWWk 5 { b^^qiF Ps2nʮ[4 (@h4j5"cx@#i;c:\Ron"Y^X9i }%EWI VXy G(1a_vtRso_ɿ5rr X*g Z51t#$$vx,,@KCBwl99ƞ"= .vey]=Tvs8!"!>)!-,#˽!)4]g) H2*{Eb+nĢ`8VRVGcUVY!n[CXc,)J"F%߁-P#5"8O19Z6gqO'pDK  2Y6J6҉k)w(Q'"lX|2a܎5c,L6D~7d?N Ah;x F !vԋxWL DtEY9/v;x&6#u/ha␁K_#4ÝH;  x| 2SPcDžX1£!_1OE$@y> PFcp8}mxB}l'7#4{U͔_hx ?$?&zO b>@7ޝ5D.;% 2| 0Y0>^2s,c)JgY`CCbOeWEʘ3⺭) 6ݑeG "?0|"LQ$L`X& gэ{y5j>["1ɲ/ y:P=2/Fe9r/}3Sً]hMPd̝/ FҘ . ͧSm DĚg@[DGĀ2*Urh+L2rlA43f$Q-X!f9./Q V׶<*W] Mcڷ%-|!? ̨J2` uJ9qB9k%lekјM˒3ā$ |ø݄n?$x?8d .ʢNsd%tnm(_|9?DM.HDB29?`2oP7Ԙy$N2' wL90WL$H5!FdtL5$ s\?׃$`(]~ouc7CV&."`rwIx#H˛E0O %´rˎ Ojɣf/i02ߋ̋bqܙ%Ĩy%$#sX;TKy653)6ÙW(¥Dbh[_MD:4}ϛOph ٞQ:1Z .ly[ ԏ/!dVɃ>@2KF=k%̄`, WK1P~5 ):υ8N),z`?O ;A (|H8w L-{bg&2U>yo_(*LAIjxYC Xh QиLa8N \ˋm˪_̌j2 FdډŘ]$sWtVSRE{Bqx}fqK #FSz-4%ٗ#/J"WߨU.P(GI^sd5co2Sg[ ]l%&b./(HDљPNG'*w24򁨮H@äNdiQ+,Q"y`) "fA5 @ɨ;cW[ķ7.N|3H@ 3"m2Cg'~a _yfAb"}2g0H]%hql"=RϗɿDalU0"FaoB6:H! I!БD$ƇH $V?vހ(-Q/H$=FexLE1ۋOBQ 4~C6Z'|DT[5ȣ-6Ũr9D+Al#nE$ _G7]D<X(Rv2-C&Fx0x@6I޵_H~&H8>`%7$PPNĎ͈ {#fϲKƥp>eO<Y_l̓ڎY?Fkrt n ɀPuBH4U4ܐ86+<,2-8DDn)4@fp؉݃ !>g,FiQ"ĺH1T7b.WF\ DD #OlbQu 1a+S[0aI /ON ʛ 1 IWbg2(/Tni4WWU8WUtF%9d\1).$[!+gȑYd;]p`\ $MI&9RYŢ 0^{DB7͜%ATI!*zRO Gýoݹɷd9@31KRy) K$$38N10 cZy=ʬpӾ)yW2Z8 # ""AK3bD-fm>.d|1k2-1a3ɉ DYSDO373ɡ*깗QXHGx,ՒbBsDsJ\"qhqhY z=!lqNs=˾6!D}se ! r?2ÎH_dbNZy2t+E@(PYVӁ1zg1%z վtLM0f0*@GQYukyęloKe$,wiȱ5,c=ۏ m»z*Fby [ [$FG 0z&O.RxGuj)SL2eʶ24f@+",0 5$gNd:8vp7P ?u191f#Q,QmOT'OUb_BAi)*u[Y"! y˵ںyڪd*M;\B2eʔ)SlYP,jV hӅcԀ x9fªT`*(<-(Y8jDeU!}+v2Bbz?@{vx܆<G$$B+AH`y`\.inB%)SL2eC-LX kj^4 2ђG|425Wd_ȏDp9v/cR-V}Z '_-G.OjHb@dWR(/٧Nrbo&"tBL&,JjPL2eʔ  HS*Ld7lOh" fW$?L'+L#Ԫ`)Lx@yGT$9WLP.u .UM[G' oH1 E[BS2GӅؔ+ `Wƶ#I# @P*MbQeʔ)SL{֊R2 yH@&HD:%nБa]<(W.X4/~Τ$ȯ4 @\SFXBI @sA 9^78F?3 깵~oiIDH&A>LD~)SL2eY# L9͒+q'׉p<8!Uz8mP%|lT91awR|ɉr! !Z%YH|ڤQfrNw V~.$ qh@ !β`S[ܗ'c"hv(YLB25 uD484)t4MMRdU.Sˢ,L2eʔ)S&34M LF[s`h3MD|\>@B. PA$"T)^cW #?/C9.{Jv -J: n]JQywɀ+y1?v"Ho訙1qf}Mm65/7Ě͏RW_SU7>mF}}C6}}׬YjuvqgpP*z"&eeʔ)Sl{iD!tNSDZ[NsĂY`8 $FQ+V+WI@@^5ޥP5c(~rW(WO{_T@Ro;IY)|yڂQlDomBiG `D xcqõ@?d$_D@ S5zm&ܑ@;CsR"Tjphߓc0k[rTvl@1S8}jӛʔ)SL;̚@CĤiPCsPC$ -N+- |!(CXd0#Nhg9Nue*XT"/- zAqhyh|}_'y?@&M{L@+MBN/p.-}[9NUe3쎺AGs$a GOpLv񩁁p00J6֥r#t9soXnx`ow~$ob&T*&l/OK{W+fjI(ѽu`Apš$;[T29.&T%)SLٻOݝ5DQs>8=޿Č9Lq9kq G/KF@A*g^~H*,s0)Ȓ%Icav8T#45'C$ 6 8=7g ?T'3k25≨`#/B'_;m>t?1ߺ-:ҌF͜}.yq0$=.ei _>ȽƧJ_}=Z@-{$lD϶>9W>ST Hu_'4f|?+Vՙ(SLwg0 s-D]eɂ$*V C-պ$@:I|E(l\UWHVtd$JӅ] s-0&4||Dn_o}1Gk(#y1hݰ>6e}@iZ.Y@Ғ{~ eLdbfL-ǟuw Q5Xj93lyexDٞb&hDcm6(?f_IJDMu`$L$k5I Ug=U7uυwXg[ELju5720I֥t֤t__o!/&$L u"-Pj3 iBVl D+hF`RR>lu9kAUSCkV:C&=y|0Um^Wl-ejFU B"EvKZP2ev-D&b};>%)òC5BD"{yO#Дb FqQ( BJn ~0F@:[#O *;x$`+B*chLٵ ++ns5tu[BPț [v<1ĆF}&ݐm;N;`ģty]4/{n'gԽfCwZD]oȧ'ٯ-{mmCڜ>/nJݫ{~\t L9pF޶jZWR&x|tJ3wt͸m4o}s@Cb~'}f5Uk wvg?}>k7{fcu]=q Տu}{%7|G/ $өV7Oq`&Ќ{: v$Wl:}mafCn~]́[_ox5wzn%޵سO=|ωY0 5B-}Ƽ@dk& pO^ʔ)SKӑ''78 ~6Wx%x b r#V(h SHTv!+4r>#]#$ +LTo, k /,HI[{̮y?|'&٢_pz92d]TAt]J%=2ѬΆh1Č=N] IDAT'k~P_cݏY?Xs5/It7>6'|悋l/8]0?~hM#@~f9w;mUl\,Znځ&l:Ok @nwW-uf&TSY/_?/~ۗa.ƃ7kD6o&IMhߜ}z l5_ג@&-[;!~P9.}pӫOo9SfWk}A+6m|~u~?Bn9nf_gG17134lns. vm UC2ev5@oEWl EJ8 cp(K13)S :]/4:hA0IO^%"?8:2 b~npsLrzL{LF,ss,֟pMLuᥒ:{}ɤe;=p;6㹗{kyVJ^\Ke?vwoYpd[/?[[^в+{`fC!Gۏ{zW?9uR[ѴZO-_<.yӊRLv/.+a}YzگZ8:XX֐NfN76յ\Ԧj?uGDvNx~òg~CMlfɂ>ɖv`\U}3ng5-ƫeʔ)DJ Sv'7(/@f*K31 \@mv+x!XfyPc]uSΐ ^`H29qA"5&tB&OL7ǘL0pЕHhSzЛ#xKm_MgWY1uDBYtwK q`p(Hwŷcje?67RQha[o $qq eLHeݿx9;c9{zQ딳?+mz0ӎLLh۞sz YL${r_qLB&={>ۿvMXz4rm z?9rt'^$SD^'xԂp־|I%H!m2eʔ)5]cA &`D/jhH2^ B? wCә%[9&Ls.p +ǿj >&>egLʾ#Ga9ڮ>>@_"& 2 2'%'RɧzZ `mCyu?دmbz*$^JlJ%ttˤ<e/w 1_9 R9zͤ#򅏵3x5Iqh(7]pk6/}!PSzx/d!]^iһ/:iYA Է N\?n؄d݄fҩ]COӯ~hVeZi#ż^o$ibz4HOdTUmzt~>lOa=Zuۏ~?n/D-nIqz0WL2e@>9%~JxA7H/4 $_HDqm>RwsB\߿PBP\2ʱ"Q(+MI!]y,8@^I+rYsIOZ#K( 3]ѻgFhdښa?CڔId34>Ʉ+D髭 w{w tu?v_|_cz1WOztep껾b}mo!^c6{* Ll/D5Zk9xp=PZ+仟gs@]zJ%3Ҋwɛi7HK*wR`q'ؔ/Ź^^.p?pn;R5UVcǟ20ÒYҡ MK>/?WnWj*eYj>N6Os޵T-w2eʔbf+z F+Q{e0f/rп",qS`tl` fR\JOƀ__ٿ, ]b2Lα@;N6#@:i~R- CV(qmG2MLzժ5fPM2WZͦd;nG){9͟ѐ(t~}补rC5ecZ}k~;Yy0Y\Գ\PYvMTx/M[OX6m.7R&//>q3R)XLa9@i*Te\/ 2@Mek4e`VCs%ț;?"mY +~i0ΐa:GvoZfՎwOH(SLٮfn9|+Gqn }_l#ޮ'S9S'>)EdT5u/e-lEq꥕) W``2ի# VܺD`!h:ڷ& d@kzEPG?ؖ,OHp~[u_*I;&M29'P(7lؠ%` w 1##F`$f0Y`ЀPOgpJ$kzM#?LbcmW9HAϏaMs*0Ô) %ݴ%\j%B2097aLh5amǓżu԰ZSUeDpTJưX<+b]XAMVK !Wv"kaU)#a4eDaus*Q-WL2ey3M$Z"jhhj=\uSe0AR_KB+(G̝$'7IMSQɂp3Hᶼ0BI"3hv ):B>Ji' BaUTVN?[ʥ2T2)۱P(VruulFi }LjwTL2eʔ)$u/!h  pMQp?"K8ыa!> x_K Q:L SL2eʔ)SBL;/Aq0Up@+ueM e KO ga_S̆Jп(I Q@@JQ]QC.!FÕX~IVL2eʔ){6>uɉpZh2D ";П`J}CdR^bVVEC`Z1O,Bl~ƮsyIľ @#C2eʔ)SlW"."F`+*! *;4+z?R־ :1|iɜf}|%nCO>OIЄ !1SSnBeʔ)SL.EKԀ] gT&xIU؍e߸pVB8ŇȜ]*ND.IPpW3"&Vc X94FZ bb2eʔ)SL{xZ ri0DgS yh`ΆDfr_H).\F4K$[yN%Qu~`LiLsΪZI&SaANQlT4evͧ8-|n+|٢e?r !GQ&|"`"h,AX? AWf4xdR'mA,!1 5;ȡVevRofIniDL&K"eBKR#i%ST2VAQL@]Ud_<>C놼 <Ww$- `Ll1iKS*DR.bMA_a+d9p̆u`#r)ۙT* }ctt?/\agLc+R*4_ŸL;`F9$H&b[ؓ$'ߴH4-6|uv ,_BϢ_W:V*, R9H|_L:LZ Plq eiV_N ` `95Ԝ^1`""tq@DPtx"s.MXJ9pKtHqt{,/E!qtQ.EőWUN1[L3mUs03zss3"U4Mt[Ʃ-ja;>8gGy0 ),YB т,wDQ JI7F@;Q<:uCĜ_B} j Xƕ;0O"$0#d:&2bB|(#K_`evp \C5 ÂNhiaTGdp^EmZC?0 C)Sw*'6%;wwc ́ beq'_nKrFAy C]0fʡG@T `$o617q4ſAcmƎ$D 6T~xE]Tg9O+ۆ}#I,ڢ? XǍk2uc>ɤA)S޵lgILп d_GAd9{ -rL.+B11-0*x"v `, :NGмoC+l'|>??'n"pS+Ãt[םsQmQ[тVO"Fj~w\F6?D0 ^GͱʔT&֤xkrh~F)qS(`d_Gm{r;#utΊ۳t/sxΌ@ěz?)gd""93R׬Y"`h4d2vEm!EEkRϟv9gEL}L\Y ĜH#@h\8q WF _ODAsֲ36#Q39`DT+&X![6K+gcC PDhlG;:v$UOz'@GOr=X[Rԭ^|W,'gͿTNm%]oko_h1u]:P^tiGGi'N<蠃>\E"+^\h|K_Λ7O"z'6m\,s̙͛Gdt'=K,n;~:[|ƟϺu-\݊dXoeL$>яΚ5KӴ+߸.]zfl'.:uZOgg2޾e^|ΝFTpda}p?Xi$dU+,t}WYJGH r%Q'7#Lb16 I Г*ǫ=K]ws(j@t}]*7@j 1:SF Uof遇L:q}}}ݽcׯ&fϙ={២ANvɾY ;ˏ>趶3s1?6lCADdr=΅Fez!z jkkNr'~f~9ڲ_g^zJf\ɠ[%]/麮+2e;wGh1 -?a`BB$Q=F 9ʂ:Q=A(.GLr& PBVB1x@k^-h:~Zjq9@lGFy߾m~忯nڼe%ݯ&\rӧOͷa\g>ɹs oڶm[.7\yOkh9k/Y3gW_{}dco嗿OxwwU\w;⊫.\C!? et}bkS_Vt]'?666&4wq=ة<5HOG^O?}◾te͙3n{W`ܹ}MMMaw7$!}{Zo_fM"X`z4O>唯y>8~/n[bE*7oN?ŵs-![կ'>q=wMrJUUՙg*immm4[IoL%RRZ(&Dj%o? @)V?:'mΧx>[yߐ4wBʋcHIvUB  :$W`"nʞTʏSPn{SN9~̙wd dn7żu\8Kg$}cN;&k`0cge2ev / EB1b=}27p䯷K.`R>.weE˟h:|]q;V/b1BH: "Ki„3^~yiS4.][V >jg͚6cz[یhpppxxO>]/:v#u[{r[n/g/^[oZ4mw?#Ϙ5g?\UuuSԪU֮[^ko4y~viNzO80qL&: J}+_\,Œ?BIE)S9@'áEx~[GP+vZ ._?8Gd-A^)vd4 . ǥDn"9yzAcf.Y\*^}5xc囅Ba}?YnڲۺX][tX۷vt@SSƍGߘ&|s۸ÀF{LWj:F Ɩt:mqgg'L8eGGܹs`VOTJR8e}KLZZ,%"ke^z7nhfTshڴٷl_W~:uT-b>+ߍrc| f͚裏 b)_Kc2e;!r$NpZcJ[Lg(O-ǹ;X}"4|n V\!iI[CKq7$X}FBQ~V[ӹZLwq*/PE. Xn]*b/^sŒa0aw{ ,g"a\nF Y nqҤIկʂ |9+Wmiiq30OQ`gU__GVZ ڲeW_| /H>{={*v1(~V[ٖ͛7gm޼κ[[[!AD3fr94&C$w)RdRRZ2e;BV {*B/|EZ@ cDK .a=,π?SKC}j \ N"(6 [+ ~Q(B80IM&͸wek Z{zck׮\бT*hbKK*<-;3,WEN;R{755͞=G40|۬G;fMӀnƌx$+0ĊLt4cc鈸eh8Պ)^8^t%5 %d{^0?xb:FUV3"bVذ~9sXH |Y+ٖ x &9眳y+n~=iZ[[{SSSWD&-x!xq[ d z) e}6="ё$DTa +o?}Qgk${F yZHwB*W -kG*J}D~B@t{,.K><]b9'Nd'|==V^nݪk>TW|c'nظiKRW׶د}~.anʼn-͵55\yvxuoр7x[-}I/Տuʔ[6_ͦIp/ngN^'W]go|x7C=_O真t >[o[6L> n%_*XJm n4iM?{&M馛\PȖ NR/X|9TOIh%zؕ)I,*١?b1M@'SA7[חʩ5'jEԢ,r3,B. qF/4 ,;Ƙ*W#BcGqu#4؟~\iF&J[,8V~$03wtv{yߛ+WVWB2GP_18S et ˅rT sfzbQʀ4_:;gkdN X(QΪ^WvD_(Ko;ˁcyd4M7O~9ڢTruWn,|.z@ eʔD?+`j#6{_ sF(H8EZr:_RpwZ<:$SxS#`hlƹBv\obK{Y[ 0Mmn&ou]XHmQ[Xd!~ˀpyž{\?P(ٱLi^%/ ӕ''iF:$sL8I $fMbq˰gK%r 92IN A};v4W){axdTүGu_ `9,dpidWyZmQ[V[KN u3έuqf]]sUUz){M a&8] 3 M B$p#3ˁ#=>= .-qT4Fgo`AUT/4@Y_"NXϨ^ٻb۵TG## Z̅hl,FR6m'JDGz{z/Y7tp4PlgtgIC[SCD_ Zl?38E}n9&-r`Wyg(( %SC<$EyHPf_V_ ^Ю. ) )^s`r"gi[5,(BЪ`d@AdxC,obkEs&ֻj?V& \'tO$4_7[Imٕ&:ՄvF/(Lvvv.[/.زfǧ2ev 1@-Zҭ@ZRhu1-?A9˫oBGR~e&@mJrvQ0xr. i>td$K0+@$"mS7 a[ '1b&|EHp\6" y R+>p梽ƂAj.E7 _g"K,]jiQgVmfMN2ev(PXb.%*`d}?p[WŐ(*[7@R&0NB'c8 5S~y9X7*\}@Q#JUPIw RɄQc>3*Dk*EmmIoZBdB󍺄`eiz2evh :+bb8jhb1y6l._s +TFTp%$i@&,`j ,[Ǎdk=Mg>V4L2eʔ)S6vf 6I_H$&ȏxi"T;BLH2(am!c)UAjZ0j!NI%0݈1_&Zqeʔ)SLٻmbi*UQdQ/mA&8n)L=3F uYj5'GQ]CD)EBѷ( 1h|CCBP CD"I't]Mumu.P ʔ)SLPҫ;TIXMAe2bY%B3r 46*9 'QdXCO38FGguBG9_ÈӘ ̵B?8.$IK 4M]ׇ:jZ&4diiʔ)SLvR,L@d9(HB*c/RO( Ewh9SvB0>gbrK M `)NQٺ.bOA|gg5bAªcC 4 kĄ: .EW'3Ľ%!ÕFEu,yfX8^rbV7OTզlUռY3:2ev|sp^{uŢ}olzqCa+hq[ o}@,+`xYqtGRIe >xFStQ >^ y0 ¨kJLyi9Eff5&W5ybӪvuOeʔ)' ʏ(^!};̠3'S~NN2JHBO{iY3Xk2R2?}QU@r@z+ ojG.q4Wpm[n5ז3e:Wy6իʔ)Sl4(J;𮈧NEʀă_;.||c}V#BpǷ$y*:Jp bv o FNAg&D'~4STU6N}7oys/;}Q 4ԗc\q?=G~c^xvשa׮Z{ iOo_ܡol\ff&cU+>Wzeg[ z[89\گqo>;wZ^.[`$Q]{P'ȑ#[n-((+))ݾ}}&M4`s'xb֭L6n+((m7ON0/~{nX9vؚ5k,Yo<|UnƮW_}K/-..>%ϥ[*gNZ=ٸq-[cYYY===Փ'O>suΝ;+**{zz NZRR}ꩧ.!Cu?pͿ?]RԍtŊ4( / b{{z vʠ *-8@rf/K bNhܹV@x1Y0hW U|)&¤-ި!qt 1U/ئ Ëco>ԑn"XO}=Я~ί|OĶO3B5;3#贬QQQq@ 5vX_U0+3՚Wp۷O>===}Ϟ={UE"EQ6m#@%yeeeO?tWW/m~G|7x#w?!}p|999cƌt butRPugWw^NV'ڶcV%ܲeKffyT~ر>`˖-EEE[lٴiܹs y IDAT~G&  xms('=-yWYtұxW&l@6V3&_.?00w.PX_;0?qۇ!U Q?\_v , mP~y!/;khXѮS^Yy薛sѕ9Xq(v's|矝8i|5ggfۏ9  4d%H8mmm7o3gNnn.";v1 iӦ S[[[XXxw1Ʈ^=55uڴin,_WK.}'77qѣG>Uĉ999^qYƎ.#~嗌>%%%뭷K{`޽#G9rm(1yyk5>V74ȈNG!wn[nqDzzz<h"j"0"Ѹ!y4WU nԿ4}2婺y x?=te|qAN!woHfYe'SG[:>|pF2C7,c?cl|_{]ٳnړuƶ K&Tt%W_} Lrw/[駟~?~5y .;~c=m6D7n^\\\RRclu3v?x7;cƌov8Ku #X>Ӂ /P觟~XPP0tШW),,|͛cǎYf+Hmmm֭3gTxVXQ[[[WWw _^5GfΜs΍7.Y$ g.--uqJh|wg]#͜<6/'͕56&x溺,SWQQQVVV]]P> Z[[׬Ys@ Я_;O}Wkkk׮][WWJKKΝfIw 7oޜhѢk߿+''g„ V{{ˏ=5gΜ"p787޻u̱C-;z gLLp8Ns|:15 T,z nѻ܇-,B]\ǡe`㗦(1?7b *c(W` FyG)clb]<%?yg>>x16mbw:_Ks:ݗ?=u(kTVZyӕR}/g󯣳;-5(ZUݻy+V,_|o/V M ::kGɩٱc'|1r)S9rİs=Æ [|]w//x͚5O?.RW^z饫jٲe ,xG?7 x Xnnj\`Azzl{0d7|sȐ!wuWGGc,++{뭷?=Sŋ:c=3ƍ[plgwK/꫁@oMH$o߾_|q)))Uzoq~"gO~»mͱ^}{/_qW]u(+WDQFߛ6m***3m@~Ek{ 6#/'1mMHXo''SL~CV ַ`0;p^^M7tW]Vn:qYf1V^}ŋtM3gOj o>lZoӾe6dewvVV{+SmKC8?쩧hz)70^Ӛ\iuϿ 1Rk7vdX}t]7YC40 tohkܱ@A%હtRRhJ[TqYIe~~Xx7|v=}:uJ]^o ,~.i)u|sa󖦝5pipAыϽxG}̺FȈ`8۷*;;; bQQ4^h"ZG`C4`jjjBĪv!Æ njjWTT]wuPh .|c{'>3fݻV3;)S0.^{mѢEf͟?U/">Jl;cl…{۷O6_T?Ș3gʕ+UO~~'N^xuλvڹss=oq1Ŋy?#ۮ3|xj?x!C_~c>055UOmmm0aB06lƍw:tBkjjjM?^MrǏTKM}.]2d~1rww{z~#F1bݻr?~g>͗^yfnLtl;+/J4(==MU^g_>`WpRRv#wcؔ3I;0Qc,4Aʄ, /̟Nzi&r1 B~p=PǺ4Tm³YYYM;ux/vר~l>]"U~9&~?|2S*VnHo Tٯ;{0vc8^_(**+ygСCED"䒅  BQ7#hhhY`OOOff& :NS+)z|E^^ތ33f|'&M۷V靝?TVV>쳼ؕm?~1nݺ_~СCp+//OgȐ!K,nV}ceegULTWW9;;W^ynSnj4XWWך5k82bڟwAZTu!1S<c`lbc^wkiiijjo/B,Tinn/(??رW:u~-򑒒뮻nٲeÇW޽0 s^MtI cyTU]SS,i6ϙ3G}8iӦzkQU5}Qӎ"H8VMS>}]O<2^TL!PZ7l[dLi1lYۺS9ϗ,]t͚O W\ܢc`Fx;N =<rh)!xb.n[4@5 & "] &AhYg1N {>I[[kVV&~x^=C]ޞ;e0{=uǣtéEdl]]M(DPV:":0_!Cfeeڵ+//jLHCCC]]5Vq_C|駗]vGNr|Gʣ>oa9`Ҏ9r=\?pjj/[o=z4--СC귲+RVVVVV6dȐo~7nTC]^,nE]]f`P}{#83fرcKJJ;6bkJ5llw  l0NDu0f{L_;bw͂xI-2axqnVh@qO" >s+ޞPY:e&URUޚm'z0nÞHXXG_W\H$R>|ܹ_8gϞeҐ1d흡4oG"1cƔO05|_|WS3czx+clΜ9ٳwG?2%˶ ^1VXXsΞ믿^u 6ذaúu~߮^Z-o*YWUUߪ_ 0`Æ K.E+x{*7|1Ou]nK6H.((PH]Q}19>XJJJF/z~ 5MxȑÇ_?pA>^{-clBF?{[1s΂ ݿ9sB+V{,Z\W__ϿPWWDLB!36`Y$^v/w%pſ.’XDЃ{5%Bia,<k*ͪZTfPw6ǭ~Nͭ3&4-oݨU8RŵG5~,UUG~Ȫ?jAI0_MO(M% -[o=ȠwEˎw<hp1=ӦywSS]+Bּlرc+++OlHMM]] pV3ͥ]!?E_@@]bʕg...~嗋ƌD/?~믿^]]{zz~|9r5\__,,,<|1c<3?g2dѣxo17. 77$3%uX}Q zDuQQQZZڶmf̘Դw^ϷxÆ ~(ڹsݻ/^l]pMMM7o;w."nڴ)??0]V 0?~ڵkiDIMM~=YSYXܙS9g[jXpC;x`>r1VRRb XhIѱ|gddD">X _vE] ***vuUWeff"ѣGm۶Ʈ._ r5ujݺuP(77ޛ;wnkrAv*..bop`9>rxwn;aWzzo0X *T\Ze##rD'Pr4t@Ӽ(b>}-TCXPkZa:/5 lMTt" Յ_vxs|ż1` 0ԏ.\?ml?q|O]dTNSωkU[}{:sQQ0F.3cJe31%%VQQ `;dSkQ_9{իWWVV_VVV+RSS3gSRRFWW\qEyy%K~aӋ/xŊjlܸQb }3E;8ׯ_o"b>}fϞ-S9r֭[kkk/^| c[lQET?~W_}e˖cǒZ}JJJxS얉+{U;߹g=-5%vN-By睷m۶+W+]^^>qDa񫯾۷ܹsEׯW\Fp·z_ڵke@MFmsEfMty|ެ–ƓsÍ+A6p'=('65+}w|uĿTNXŝ?>3yo9 $,ŸxC`֯_utp Nw܏SK]{&5wP"bQ 12 pCDu;F1` 0ba#aaq)ˎ#U#_z8S~]qú̬$ #[*wO]f***RήK.1:w1q<`b޽k֬ׯ_8>v옺};ϱwg}W|Ƀ>o8k޼yeA>46UM-e%O0Z Y\0uﭼ%X__ӧO4i=SP/=g\a^γ+?NOK[4cb[{GnVFFZj8ᓯlҿ_؟0 xス8֥1:w믿 A 0%@Ea0Ea( . ST-hNj d Cc}WV qG+2C :QRm' > "?V2H]!, "j0i *w߾}۷;nݻw7yҤQF;\zo)9T}`Aʎ@cWGcG ^ZIU@@)꓿YH7dCcܩCXyyyqqqeeCHΛ7vwwWUU=K.M'"7'gu'YtQmi1rhnF(7#(S?>IFo7첥Q$ 68"hQǭ\.n90hfaޓlyџTr~0wQb0/DVbYjY0#/+*\˜8j tpAA~jÇ߷w͚;::BPAAٳ 2`@@%6iءU#%P6ld7_KTܯ⠊~Ό4; G}`~x&*ժ( 1o8w9xvǔ_h6.IG6ĆxuGS_V=V3_->1 MUAXwC*u}k__k]BJ iV _c־=yM8cS4 S/l&Q;F ݁1IB-H*)KDYϤ`Wޮ\XϣE-Xr4!ƎrPum"9X]>i>CO.T\_FrjY`bmz؏tKGTɓ9~~DpB38xA$@1ZkD3z3dϥ-`4ӇLm=K``lmo5tW;=qch> 8IO=vcmڸCkGwZjJ;P._GX˅̇x5$Y{E&kɺZh Wic Ix P"}kvX3Ea*cASupPPjM!B,u@߇_i&Z;Ǐry`k[6kAO^~s<qCԅ$k*K|Zz"N3꽸⻢DU.c迟Op!|O4y]Vo!Oj@ԢE󘏉;+%8m=ݼo!mKwv}AE*BsHA bjJ %LPLZخ\y$ӭGP'1[+9U5f8A1{% <0!`7ES#2~(ʈe[mԢ顴TXggWk{G]}c];g\ZlAG)_x]d!N8uQE*~k1~M/ y2 0zVġ+YIMI?jᑣu'՞G"dg ؿo~ $ANJ0/#M qנ>ܯ0jopI] ƈnDզIu /5БYF`gԞ!2@D%}  WR15t W tejKmFa<24a.W/) 1e_\!tAuAA8 2@ sdqEG).ʟ_N'@LgyMkQEIh -EzAq,Yך/^d:ʆ.l;äwо| =Į1xnl2OZOAAKCp)@̑>24-K~]'cNÉ3ȟ^53 "Gtӝ*&3U  zW LڢN:$v*`S?=<#β0lw>AAg ,CPw%6^a[SY:3_6 bUШ@4I 0i4I2l  vs3~`n@bXS^mS }:H3Eh'ů0Sx0sP!h9VdŢ󗏷UCJ& е az͑u-ȫJ<G1ga nQSQ# 2%h"]'_0(z67AA1],}HpG/;%j4b%xUdCi !Aѷ!2D h]p^/4 ʡ .n,}:`Zsd/AA!bK D#b8*#`y_ `PHA ` <^ Sh-  I{ qA'(,oWC"F6(ġC|"7oݤ0APך ˛ox5f-AAS1]t0׽Ȭ6[tuzH Zr Gk@,x'~%7wv`בYt)\ M_k & tw]e6F"QiM OowO52<:h0FPq}lkV)jHFslFSQ4s>@AQy Unm :Jk0M$o!Mic88@B x1 Q@zUm@Ѥ{   E[WE.hEEQ@NWDNb X{|$xnjbj a 2s)F AA<[@mAi Ѣ:b,VzR x]bcŒfɨ;@AAnHA(lbލ }uw vXLI]$Q_l;4JAA _0H\Nu &w!Yk>>p<kfS4ݮ/ÒH) oroyf&ⓒU@A!pr $-wIZV# Ș}$%\yS!7m E$O/+.\PoG:`!)  ;Q[8gA@!X/F'4ko}TdÊD?& sokk ?I6P"2\h8շNAqf!MN h5Dhtw A鏶QWbDOPEɲ#oA@is@AxE0;UPǍ}Q7^Z=g~Gw @hs $ ;?'o)32+DAa` ^ K]&փߨhBJɫC.|IBKZs gC ZŃ盜SLU OAaۭQ'r̶&ɑ+6 ͮ)`d+$o<. >b-`&Ťn| Bv l   FKnkX;q MkD`6W}Aii~O0Cp Z<ڮ C,EAA2R<2[FI{4Y'j!1]o`(,/!J2A6AAg5NƐk-u[$(_;"_s_>M`,\it<2Kl?}6S14AAg RhB,H5:b'\Q?Ɖ{sOfK4?,f x1[HmHZ!%6)}n  Zo0tWfc5"`1owi?e`/)g&bDf!`Lޘ7fb}  \[yʂܖJуAGZ ;y3WJ%,g5"/EKȤ%  I]YEz9D{/~O1iY7Ilt5@b9fxT46e&w3FԢu"AAL~Ю+AέٖŪMƥ`0Qk`!EQ(6dZ p2=4Ȥ#ڷ]' 8u\ăK66'$%!;}Zj 69-) (Ѡm5%cP]UF(vcg  "ISӑ?p[[&3 NIɯȫJ+@| NC`*A_m[̦n W$ 9ZdAA$@Ԣ(ETJt'pDSMOd~~$6F. -CuJn 0&0J GS ! Hq_KהFrԴ1i3P*=f3b 1? Wn͸pUD-wbh8 )AAIjo5 "WCQȔ>ڬax>vv/jEVvuƇCI`Rx~_9٦v#  \kR|mQ)|K]̻t_/2iN A-*иzlQ{J9+|!AAĔQ#cnpVaƒO/X ` ba ,պ8d0.VL5U_$  ,E+%eӦWou~)dտ)7;Yۭ1-\?U@L)l(Ճz+,),GB#tOT]  B.Trѣ{QL?~)a碤*T(rҿdw#K lc.D[a,[Bn)I #Z  DE*7yǸc(8h T>/>$ ݈cV!3%"I(`XYS-.tc645؋`L,FyN:-AAE|171 6 4_t^6י?HBQƸy4<yg\%" y`IYVm(9;2ܽeH6u  *Dp8-8"xn{*}nfCbYf[.`XKd7Hj4E%oŘxe7,> c  YMHuU>Q. π֙l,5!2~ӊX  K}xbo^y ; XS  c2eF4c̃ LZ{:v0! еWwS@ bP@ ߙc%4&pIm;?  [eV8q4jp Ry=@?O"l Ai`hlz( }(`ۄA;^N"vIॿU0ea=v   H^#ԻKKx{Z0`o&8糢1v*~Ow5]= E4VdQCCM'~Pj,DS4Y n]AA\V_ K0چ# W7a{F s8}e21VEӠlѼ]Eh98 5=g`jˆho9 'kJi*|_  J>Vb%2(TW{0:C/_+`2y)Q«NۄݾcҧP\dz$O dl&EƵJAqv|fu<&MN3HDU#Rs1VYd]P ϼEQ-0[fTJ`Kζl2힅MW-7u@Aq6݃PjGm5!6z[|A@۪h`g*Fl#@*]dVȫ\#  HD|@Ed•0f˧HKǯvU$^vĊ;-jӄx0qZVSZ6,  xBAzzI uGh^En|eEr\<cAƊ,xۭd0XvE&OAa/*E?|ɈGKZfUrZ$A1YH| չE``RIJ;Bփۮv/( k  d?H|d^cͤ̇{]AZhȩu@P "߸.Uh`!3nA#$@A񯏱z=݅ت. IDAT֠u?0fŽk_TZo+f wO 4%A%2G%~{i`|xz`` AAmm1%ЧD^c|7qѨmkxe`1أ5 Ĥa2'~AAg+֨v=۹ƭlU2.Ǚ6`sPB q,13HQ[P~`7oA6AA+E I?B}SV0V]{YA{*0-dyF-5F: P$iR{, T  B&ҖhvwunHfOҪ:Zmƾ袦MǥZ!u•dQ`۾lldA! 8sK^At_4+p-sϨ8W[%RhG6ĮQzBc1QJ/<?G-" 8;wƆ !&\_,-w3,>$WִEQ@gp0H|ո>Q'%Hl̋',BO 8ELi4bbZF|.UozQǣ\?`,b0' =/CҴA8Eo QHAAg({XrZZd+t_=\(p4FiHSFS~=UDMQc'T 7Qb2+1XE' VC@nV?`HNl$   5)?hpc{u:Fzt]0~d (sF!Ȁ3kFZ.ȇπӯVf̢n.XAA!SV:L"=L&H-JcAآ8N&lՂ{47Z2$!*Y _ ki2CT~luXEAA#bhVt}OY0BgFBǂ߀bi7;za.?AAPli8I~Pk ԎyW`z}@ͪh8-0C{-gXM} )6NFGJPm山Vţ"wY.Z  H^~emA G~sKYHċNXh tݐ!@k8Y 8[U9Kzʯ0"1kA"A-畯@gЮ<@YZq`6 (  4k5o@|/̞m`U$:nECb} ̦|` (`s!4F #3v҅y\BZpm?L!GAA96vux}ЬFeS/sc DGb3Ul̊yk5䥿b,΄6ZgAA lo9P=VV%7E|)^͊*j@4YA7 aN &"l*& ||;  :ZDQGK`481xU}Z/4< ]2hR/\Q3Œ&]mywnNAT`ԗr  •? KHߠʋɠIlH$`'|j&9ΫKG( NG r T N59s aQ!@n띢 ``wC̜6 >R~kJꞓA&Ab:l{-䇔]>FBGu~,Qtb;pu,ral|пp`! a>3X*hT'֓G]Dad.B]s,pdn,`@.W*Mz?Bd9;RQu|qPkS%k* iH?2*Zݨ<#DP#;>>c)bXn^kpD,3pMEl!(W% \J@'6΄,$0sc00 `LՃݰId bApR&=؝ᙬ AcJOzA#'a|ұG6(S}"VPz!G4Rh A17vNmcB4fbGq >@<@n_ 0 {Ҵ@$U:dxW8& ӕH0d* u+Qs{^]AuQ .SjkLQԿY;h]0ǣ@dtHwDXb؍:Y;([ MdO@ [_A8Z6M/ A/]aV :0ykU`AwBACb?ѝ㔏({ ,_S<%xleǰd[|7 P |7?iY -ASi}Q4 .iL!]0Emm0f,eg0GivSGI6m;0S!{L^ ES{/.mUyR.Bi~ȷ-q;hɇ6rߣf@%4بm 7a#dĴ'hkLzW_cEݶh\”w;B/]M䟉? q#*5+4QtWjo/mBř$ QKfHŢ@GMΝ($ &2gzBwSr33"~YǞYpCɣEQa@epd"kC n>~hП8tYTCLAOiM>_B?ޒ*8 =S6l7hY$02ǣB0Khs4nB!8hfH1 ;3:DOˣRsK  ҡ &c"nb=@˜Ř-n~tYaпM:|بѢmR./8?kSJNv *@A +.'j@|odīMILzG-1<U2Dkh]uI)IrT[` @? q2*=442l]\`݀ވ*̀zwƆٕW'7ڂ1Eèd}OY *EKk I#30,_;_.s3!.9{~{祔xRՀڌGCTiɳ%JT!vu}Vǿ|9?SC]Ň[ELѣֶ-0EcAyQM+U& ·4ZP#~y,P;l9%\~>G 9VjZp}Uýcル'>[d f L@V0ƚ:I\w(]ir(p8"QZL/ ̅0;p p_x_aLłT-Ց?Q,Ow /V)Ȁ )`͝'=Rb(@{7n-Ց5+iz_yQ~ܿduL* V6n@]_KU0o@ρ{/H (1aU$qj?Xu$,ou}nWz <0O(ڃ1 c+{}fC\SF%qLF)@c I΀YGe >9]z0ZR͑Q..`\~T~̟1Ih-Ŀ1BP)ڂs}xS3S鐟KK7쫏}"Tᮊa~1kY.兟ހE-Ddӎs1fM)2\H _T P?3|yhJF Y)#Qd@ ^cվ\ ΎV橥ߥƓt _38pݤ`P1ϴRVU ^?i*=TFU.OnNt8*EaU'Ӄ,+Xo~в~GGۂc2 קeB?/[vb0]UGiݤC3BiZ?S.YaS/CEܻ:(G9Ց= \*}qty2J-kgBH A_E~ QpԿ.Z@T8Ŷ2*~Ho4tH[-yZoD0p #m[vh5dkNjAjJ |kF/t&H~l6d?f+?XSRw#1wvGU1MScDk[߫l GCNL Okw]yv#ȦWnU]qmW5^Gۯ=k*ߟS ][6wDIqvs)+i7‘|5j[OFɶpʽ.-J>@ Ԗ+ &+Z# ]ݲVBX(--.-ʂ=ۏvƖ9*i'Ϳ0;݊~p,+#=?7;0[&lGizTj {o'WU?ϭ=Iw:kNBd u# (afpa Ƞ "* Ad ,$;Zuw;s=m^Xu.{,x͜8b\}LSڈ# B)S J"ݍ(WUz[*s%dƊZſ|DQy%jυ7 ~槛 kzkxZ#FjCO7/:M~Nly][3wiɍ6,t}]jjj =N5L6K^7xW7\en 4׎#{V=;LioWquq߁- z̝Zhmȯcs8tIh}^ذgkFyԳ4Oiie<d:pkNx};PSX:kqwS5~z,Ʋ>f35s" "*Ovr|cg|Wo0cZm~x~xO[o^?zNhgÍ% w{ݽr\kc̷?SZi3'w6?Oy IWτ:!ƀ"LCRsbbQ*f V*:Љsiy޸ᔮ??:)vܕϟe._3Y=_W3c1o/epss9PS>X8&./Li vF8qثf3Սm;Yڎ$0{ ~Dvr g[ Kf\'u;֖YmXyz-zOkt}ioqQq੗xNgĿYnj'4g~ H3|N QoU&atQ:C`}F*ZB89^<<IٓD(j\TjRC9 VGҔ99^/YޖoSۆ< @"9M!c:`jd=Qfg>uvz{]=_mt[옚pBް\TgJ-eTr'vipv 抱7ng9#PnTiHkk 1M)^Ra,( |zyajہe?ڰ@Ut&7T_lk>%V(8dag^~ _O<4mxiCmSdw<^~U{Z9eq/h6Fp`>픕tqP);h`./YG*LIJ_ۧ44RQT䔨/ hRW-(՞)[: 1/5 Mzb'< L6JӤ\-vz' FBmM$g5; r%z`SgOIE[0>*y>yfuJ.ѮEwPq~C'>7<2Z#ނwFJԋ1er'N/^_ /]<& N |W33I5s[̓ݷsfG{Sccy\ٝS= |rce'w^S\<]vXcvCnd~vvLLU~Q9NP}Dm}бXKIIg[ ɇL"Wŝ΋S9FL:f5񔣩Wi@ ]_JrdDRt*PSS&:mX-sNi4zMYTp*|1ܫ5;0w3tLmȋ#+N./ ~TߦNᕘ6wsr.Z-]rJ!lm??zi®Z/)^=O; |ޝڙ{CY3ڨ/r.7 (xYP?15Ua0i,LȚvҮ ?@@"UR{ 3 X&XT TC M IU&8m?vP(K PyDR]0WL`$:|ZcS͂";XB@}x#2L~c߼oKg{⼆;^yJ/,\˸ ;+u˟Ϛ>7rbA'~[E?;=R]A_iie<Y?(Rn֋X|~#B5tǶBmݒ 5yW,ɋpZw9ܗ>{G^rJ4t߭{cJj?mm7IX{) v.?/,? AG^5 $o1դFDm)4*F -1kYP^$[/ Ƌh$*NiaPp3)K Bh4*:|s{L_jN7N`࠿c(wH)rC҆B0gу/辿9Ν}zrgmk{gvqZlrp~ՌyM78-0QRW{>2D.j_4O;KEサ0K%|Tcpf9kz{^M\zj6Sr {v7L C߸{iSLM5uRhQ!' %:T[S[M_ܮN[00VB&Mh3RPo(Ip)Xr]516[QH_D2 }'&Ki1yiG-R&iP)6 !2 l'%ah[ۿ;RBhOYC8vEӴWte뛔OGMjOv`,;,LmKG\; x)mr1+׼eC7wj蠛v[6~Hf7w8m^(ݿx <1?ym/k6xѲa&,)I9='ԴGi|ۖQ4F~?o?fI? g/eϜk<<l+|ێhl)Μf t8SkC1sF%/3|tս; +LG%D$O\A>U's3~ /_MpSLlaE"=?^~gd(b@R%U&)(2f %d, Xxg.j~Mms.+,~M uefP dᶧOɡyioq8Nw;^S[(w"9oo}^_.Zc%Ow4?n7voXng{o?w3i5`R}Zkg J?} ~œKΚQ?5ybmkuttTI=͋e .Znkh=Y8MmemNn_Nzky }|_9\zL.<80J9lE.|_yZ/AsSc%O̓mX0.3_7ɛgi?ʁ)JS9(dݾuІlĤ#X g OI־dƂ[lo"hp"Di3 `IHSŦ>,{on3❰vG|oҜQ0tԤas_G]p?+@>u˦wMk)*?zbl`$k;5ZEܭ[ny7,lՍOn)%m5v}cbOﰗ w_hџD9%dz~qc7m,Z['I8*g:^,c'}BMVl)mD;/|ѱV_<5[띖:5 n9ݺfD}6o"n{߹&f'L( gB1U LSZzH @?(0Bdrl3b^؀xVXXOvg&Ivt.SaIs6``{/jtubxYNN~؁;MkpiÞm;#nYZIhU;qOnjm|~iY_Y=%m%M{F6mml+9/lZS9{Ƿ}youwe?YnxƢ u5ξ_/}>s,LG%c}Ɓ_?7wLڻ֗n;8;jLb+o7_ 3%SfԌ蹞=ONinZFFFw766̎\y dBm?8t8^t|P1F-Yܝ]iecrv/.޾bu--SKgm{58t $йkJrAt8"〗=KB" ̑&䩞~w箝,v̜P_p9́X]TA YUi:^֞l;q'ɢ!@׈zPT1Wl?=6%'O*J[ ;h+BڀX3Dpp9#0VQ69 sA:|kRKҋ )(9QW6Ms{iW{EqTT3I]=HHCem($+|LntBnp髼thH XXd; w,]`?oro.ȼ/yǁ8_&GQעQi|/D/X)( `1m:ca Y>&cS']Vh?bEW ƋT\hjD3ddV0eAaM6U9w_CT`X题c>E-h(jD\dC.2^Uu #Q:R*'KtKz-B,LW ED2,A-@ Wu7:SaLvT~aDWH0eI׋5)3h+FȦՊOc d0eI B!̓R~Ayu""@A#Di( #"jQ#lP)Me4=)ѝ>Q" n|׏~)W?AR'W6X39J s,ob;97e'IPm^SRτ1'Ha@>'BqdE0TᑈRxЏ[)= ǨcrsIˉ \ (d խ%^R,B]9b0Oβ˂ z]DJabEd T'$fGRcmW~a3g}lYn0̡%q=x}fsɸaIp%3/"!èc IF EjhScM&IuIq-6Ie!ft64jsJK!!鰲eNzƻVh&"-?O LnC@t"yi/??fmPQ"bnOPCpnV#VB!OXf61FUoWܒ(>x~?ڠf!QnvH .#@`3H7&82T2>Iv#"0 aыG߹F[[Af|/(M5}?u Wj f씱k O /B6PO,>>=/*6 lhO~2#A%&PnJ|ܧaaDf%ؠgCOez^ŔF)j=J7Sd0(eΤEJ.E &7/G{J2?\6>R\@DojQj J"ߛH|x'eYaaa"Q 8h+1l ׃)l(].J*$4*%c# 5 , mb_ ωX 3 <ǞƁ\@-'jAxnBdX`aaA 4|V5eZ^Hdג@z`(*M*t M5~_!PZ3)H4MXaa&]ot( ⴬L⡖"O~A$:QޜH'ޑLG*(dIҏ*R|rv}+;Ѱx!ˢ#>F zTK yOŀ=Q V"qaaQ8I :m;n ƽI>#e7_S3Δ7?%kwR>qt^8 (@rJK#[zQ)>`dZ+sǿXqۮ J'ϋ xlEUؔx98!J̼4A'qa,Ї>!n9xUi ,hhh8pub;n '?ٲekʕ066o} >~]v}ojj~hxxx>hOO;a,5_v:5"fJcOBZusb;bUp@JU !<5bHkdE/26 ĺP0OT0qRn5LuP AgI6n8<}ddd޽gu֔)S.pD,X ,}3@طo_wŋwww?ܳg>aHN4ske?BSbV?90`PQ<&8V5E u$26PuhS*^-.C+1T0 3V^+n3gNSS 7066v 'mo;nXn!CCC , w;d͚5_uuuG.]0ڲe˵^} ֎d-7oD 𑑑9s o0ir, }Gb*Odвd\'Y9RȓFU052"6)hN4菝C_@$s᪇"M5I0V${PXuڤ0L"555/gy1[{~ˍ… `޽ZYo.\8u͟?o߮:irϟ9s&|I”?!Ndw'(%t&^2a ؙGHBDaYMѓ"CM_vGQ*N$O̴񜥓8k[,#@AK|P.p0xp '߿uѢESNC7M]]]===NnwwgM/_+VX"|=رo02-xz@bUFF&+B=AeZ*at*"@DiIBjG*;!bJ;>SɑRT(^o BxX3 <֭袋/^~zo3gJa/{{{  1s@Ės=ڸq#Aa>b2 6cicQu0"I-QyD (P,eNB|Hd djxhyafjydTD0 S1###>hv۷o;wn[[[[n]t93wna``@=nqe˖-\y͚5I'|_.0 È0 $hѢs=w||?Ȍ3f͚۷o?<́oy||ūtMd֭bqΜ9[nsZ{144wa%Ne*"KԳ9"\ xP`x#aԌ71(ԭ")֔v^hh[H W(.)x)u/IK`䈞XH~愤@0 ⭭^zi__q[lٿYg5cƌ}cmmm\ӦMxW7߼qFnŭ[vwwoݺT*6rٲe/Dlnnnoog}65xaRhEhT^b5+&NV$fG|~t9TʎdI%-X}5hJf6f ha􌍍r-guVWW׌3{z-~siooزe?<>>.H-7nN0DBok>S|Je*gQ2 4y@+e$J] hid~YYhʪ1$bI(T1P wp|O @.%"m ܿL˿ 0 %=-Ns9pr8888:;8^0D!8~B}skb{YLhѱ(%BuZ)$LEN;f!YKW3J9h)f 842KAD8GHe*w9ڨLaaUǤ!I}L>\>Vz}tdb?I؋00}c.JNj>}0b(ufs%gчaa&U(B._7Sd8@(L /ĢDWB5'*I'^.!?BĴ#w2f{dŨfG8X.ʄA2$qLI$9EΞA 0 ð`(r/4BYm*O!b1Y &'! ;j 0 0UE;Met{e 64>a4iVx8̞? 47/vaU]yqG z'(¦ mȫ'.90 0 K&JrYjq4c% ͺќ% _a} i|Fr5*%<DlJ\noG :^PBi 0 0̑mS=e&I+@'r\DWbg$ T=FAAq_8ۏy;@ED{ pa {bb / J.jp3 0 } N,3lu՞Mۯ?qKPwtvIhU8@H: ] 4,/h5OyRT9z֔epq$0 0 0LXQQ< ZC$/ ;OVڴAUpo]P ʿ$lQbљTcC>Q$%$vWaaFRSX)! #Lc!ScN'cӓL&A1W4yZ̈́R QMh'E!5U* ga9?ZlL;2ג識`2B;i[hܝWAXIw:E鑜D֒ P|d@e#/F]E0iJ"Fd8aaWϘ-ϔ' Qkld `u/j1@4Zhq w %$VCIfJ71fQyP("T @y `BND dM^"0 0 sB4x&",I^'sOG6RrBҦ )YcD ӥ}BUcaah/hCƀ"# [hAXU*cA]e[H E?|bp#2mӏGP-0 0 s4J,|[b|4U:[At,vl1nH.OV;ךaf"`HB(:V]@RX,^aaliˮ _!ؠW ya9(\iJ4nPԜ@BG huQH1*Fɔ2 ޲'aa,z4Uȕo( 7 +T*'NE;&O.w$D$w̜)4b0n0 0 diU+J/W/jkn l/CrR]R@G x6(Q W?Ddea92?6o |L(,"e薟#})"C0>I(݉)6a \ (*8 94c\1 0 6Ut4'/T9ݾN\:?'į!#v_eR^-es+A*$ʢHcgŮJZԏWݼ*jT caaUWv41XIñ]3@&Ci䎡%hӆ(ՆQ`d%-AcAf4؎aaUki,l'&{pBG-Wix3Y}2W,$s`@nbjCjϡr24aahp`gRΧEh~) ת"k^E+R!tgT 2X VZ|MƞA`h,@FbòL| I'$00 0G8h +SA|/<d\\*LK g2'\TQ8PQ7 .ŋwR[V IDAT)6aaRM~>XksrQ0f$K$Koj[Z&+C!0P3/DD紉'faaJg%R'ԧ'sl)KTqt>,, HK&MJXF I#7-t9’-@)maaYfUH7)O>"4WOdYߙ Xvvc|btdo|R17 -B 3 0 xVA aWd~F!$O(d'Y kKfZ 50tOI/[ Mk&;4ۅG1*Uy)aaJBY'Pp+epqR+ӎZM׌dPWuvImyi c4(:L]%r0 0̑KD:,ț]Ij5/- MB" >?k\|dT 5GO11zwck=Rt $9Sv#3o9!0 0LYHi\A8"* NP,!?NbNZx~N*V'=@Z"v8߯= &Y"l 0 0 s4C@%׍ a&)ĥh@fj WĴpXt2n(\D?0]c'[m*.5 HI@D0 0  "2 W1}|B0k@kƪFl?[J1 A4^TQmIbH A otxS(]bçv*{aa pU)6YDX#tDarL鯝'ЯQI/E-'mפˉ x1u,f 0 0Gr%E|EܡNUjf4x'h{h1Nd:Fug%*bQ%5Mm3;NC 0 .+z!e"III).23Nm*?_z,u#A$]d;&ɒE="+,E3 ԩSy>D% KCa㒪#GQnuTWyE$2mMidvJP!N^VWc4G'ڂ&sR/͓ j@f:lKaa ܲhgTO$hc mS;b[E]nU{_+ppxҭt+>;ctJdaŚaa`"0& JJ u\O&XU(7zZV=AL ȤbӑdNH5 tPrAo}!0 yHSj1 0 ü@KP feD1`aȡQ0n5@"hjqiL#u+ 9 u3 0 sj(?*r,DP$"XolE*+hcUi~7卝0 eJ|5^ 0v][$?Ի0 0 sRIKlPfH AT2֑ &Mx1T8@KH?d5EЬaa Bq]*kB/-~Ey5~2k(Ra2Hʭ%ZI,:maUx]0 0QZLlrRs)! ƀACXe 4kL3S'H ʚŖL6yB%(^`aIѥh "*Q2YT /K4"V5Ǒa.Ҹ! /LC-/bəL9)*O0 0 UT5H&@ց%qj.l;U)Q ԆRL#FChl~ 0 0Fݒ-IȹH]DYbahka=I%{S{?IvX…qǑaa&=PnITBUieK#V2WT&EsG,2[Gܙ09r,K#Hda9VĖ뺥(CPҪ+]P &!)eOS틌AYSKCӒ&t emaa$:u jWp:4DN֟\D/ta &d$l0 0 zlߘ]% KT_b' ?j9XxxBaPp et͉g10 0 sīSvP9&'wm!4QopM9''-r0-7Lf)=<ҷ0 0 5hނ(]&Bu6f}rT K,|;UzOr0DdɒkfӦMcccoӟ7?'xW\122rw^z[zgVX|e``G߶mߋ[9w۷oWq7Mzklu]wݻ p_jmٲo+2JTAmKȎ5HpJXLY& ֡ A60F =aab,\n/y>y|Æ ]]]\rwQ(?G=\ww_3ƞ}mccUVygL6R__g]6K8>{w.[ ggA-Q'T"*Ƃ,Y;n'e1L>K9((DDndcHqO>cwq_'utt|_{y_]tvO~Gw{o?<7׼7/͛5k<ny衇fϞ9gΜB nx_]WWp}C;޽{sNev .@*o>F0Lي\DDfhV&bR[ymcv[p y2%T{@ƕ2w$i괱L7tӵ^;WG>r+_Yf͉'/|!}sӧO'>˗?soo"*k榛noWꪫϷQ¼y_x͛'r>qfϞqF>\y啮> sYzM-̳\.7s .h0 J16\r XQ1VRIPt;V.kc'?'boXiSOj*#dЄw $l2Xti%gV^}1Ǭ\o,J_~yN k`ܹ {Ν;`ժU[ ܼf͚N:>:{a:?-[< W~w{^@gy%\|[[׿7oկ~e209:t%<I=W|%g̴DINڏ&kIiҿPB3"݌Tg48(\S*@֚ Yavr!{RΆ?O'xbʔ)]]];wlmm \s5vmٲe˖-[/c% 6.w[rT, z׻nnذ!:3 /$cǎs8~W_}^7a$ @BČ:&UcWWPў?/Y3^: ٛPml2re ثJS,3ÏH[[ƍ.]|dҥ---\qT>P__i&c>_xz׻>ܹsժUwuQxC=Ao&m_jUMMͧ?\.#\wu_~zSS=ܓz{:sL[oK.馛xa&،=8v' AcS"]]-@kI&s"u>aMG)M~!nA{[]WhCPpieQ'>&'|rʔ)]w\veg}Cnܸϟ9s??׾|{c}_^dQxO7o A$>66} ox^}sؽ{鞮[&{=餓:::/_عsg}}ԩS+0ZZaRl ' zJ44KgƑM %f8jwFL S'+<=ׯ/S,=)SZj˖-cccuuuwxC=~+W 0ϖ-[կJŋu[n}_ny߸iӦ;v6oO=SynܸqGկڿ?+`NKINP"%k"wԔEB.SaGS]SMA 4PW](B SW^<#\`hhnG>gϞkN:pmm_CD+VO:{/xsr׿_V\po}[\s?kO?}./WN˳^z饱m۶'|};Qgy'xWݻΛ;wg?Yo|bٳgo۶Ͳ=^(7ߜgP-˗X)aIdYqǼ{9ec){'OJ> rmz6i"mX3L{+ =o |SXf5\۶mk. .ॗ^7AD77W]uՕW^կ~uʕ']ݰa_~dꪫN>dy 7o.O}S;vҗ{W_}W^/}g˴}P(s=^zOGGǏ~#6o|UWD0 S]o?v$>%wkSEnC&2\m -˧B>ԙ& Ee$OQ]"0wgz 6@;FD@..ދ/LdB ]+Q SxY; C'90|8Ct!| a e%Ѐ(H? 6`,@ɡVRo6@JZoma=W~^0 RS樾1b_ٻK DDDR%8UUnd\u.6䑟GM9R)r)0XRtꩧ1 üBտmO: "rCBQ"RY](}nl2T~rL oBc?%,V T38aVف$|ETsX:X?ETrSo\!z2GχG` 0 0(Gƴjvy (ʄaTQ|u5kƔW>*vXG[Tc@y}aaC|Qx^J;|)Hʄ >MՓekSӷ ߄VAlyXe8o%I,AY"aaRe^DxXoD%do6 ;X˪g눊/Hhk(LlH/!CS F:t,jDPȋq`EKE!B_4CѶZKeEd9sYks{ 9gߵ<&wZ 2>h{X%;0,Yb.B!hT2[븶ElvSHL{Cs2mlo v^sW4`}Y=2HH!rsMB!QGk0eeRrKkx?S O ǾdbBEE{]hoe~ =J%+'#TI/~Ud !B>]DJF|Z(_ 4\7?E>Γs|692yzB!,Nҵ Ic$M: 5Ⱥr{n!@`ć۸4>L9vvH3B!$EM@( "_ai{!C3;i;s;^VW-h Htv C E~%!BVĂvIbF;uD 1\EyRߍl ]U#[fOhS- -q4T܄B!+TO]CEXyzo;ӃF C]1YnIϮCY[cnSۆ3B 䏣B!4M ZHP|c{!0 pJmHoF5Ҩ%!k&b J0o{.B!Qwfu/ H'mEqΗR._ۘF/ IǨ?qa 㦻?BI$m5٩D hD0D@X ~&]Ty0GtS$ IDATI`iLcL;;P\:E0̙k70!Bf *~XfВa]l/һ`h`T2nswIը&,Xc"abL୳аɃm ЎF*5['rGAB!3aGb$f%4A'&*Q]n= `Zp AD2 &v"ԣ_Sr`B!` OlͯhA▀>vy#x-N8,oȖXBx-r1_<%Gq4%$smY&z؆ 8V!=)|LQ-_3Hܯ۰̎ &w7͗_[7cbHqqt ݑl߮eH# ^D@H>w8BB?O Tvn#so{wZhTFڵ 8Ķ'k xNk6sیݻɗ* $њΗ)"-CRB!`.I>>mJWSf*E;'OU s =#3RB<^'!F7i/zF<L}*B!XIgN'MsN!v8xԲ.S Lt};%!WIWyVҮFq<B#SUڐ%~09*O7J4;)#3>~>!4 ڻơ7dEvx !dG/~w޺u loo=}'0r!g}ƍ׭[wޯ]wݯ~O7lڴi>n>f֭z?ݻ5,Wc/w(VIN I;Y>f+ _3Gj$84?T|AA,통J$W4O;E1HgCY\s5;s}'>OoFR}T][nݵ^oĺuY1.۰aÕW^ywe/;?m۶jz׻>{;?'xk_݌z7TUuGl޼yo|W)"e)177jT<̉wi/U O gnH}/X7iqb>OY1uܸ8Guְy 14*ns=}{EѼT&jyjh޽[n{ .9y1C=꪿7y睿۶m Թg} 7|_5}/| ַ: [neÆ 4, X7Ocݑ3SLKLO˞lnn5 &M-x+X̠s{Rhy'~_|_W=Ї>Zo_򒗈]wO~??noذ~GN?}]tE;w⋿c8㌋.Ss9gƍ|3_ޱcGR<)gqƵk?7}_Wmvy]vo^?߱c_e˖f{4Wo(ã>z)4|3#jrQG_yxGV=0/W1 dz,qfυc_է>K/ .شiӞ+oK1oxSO=3θ[n:Nfaa3ַ|'p .ww?ٳx{{v.}'us>?K/Mmm3y;937]}gu}ݷcǎ}kt=Ν;yK_>N8Si~ 1?QGe>'p1fnn}YgsΦy , YI39O1\woV! dcrUr.̠9)H\0*+~ я~TO?{ު^YZk1|3?N;m۶ڵt )1O}S7m;vػw?g?{M&P;G'?1Ƭ]4Խk9ꨣ~Ծ>ʃ>=~6LYeK逜H/q>nD߉cZ/`QR6 ~KdiyMt^KH;8z_1fϞ=K_)Iw ۿݻ;7/Ƒ?EZ7i0{k֬ٴiSJ|;yklذo}VƘ/S?OWUoN>{д/ǑHi # ԸITx;Q@,i-aIFT&}ܧ&=C/~5\׿~{lboc̣>zGw]1{9S<׾Yo߾[ne˖-'| ^۵kW y}tM7o~+_vWUgu֎;/~c߲e_c}_͛7Xfͱ#N<=r__ok&VQ7B: 3C )8ue7DǻYJ5X˼x4777 >я>c^xᡇӟk[+y /pڵ{WNhm~=cuQy+twqyg?o߾od;Wmssg7pg?OnC9d˖-|;x~ Gq}{/:Q!dw}DX^H U P*xBvLJu8OP<]8EF7LM'H f80X  f8p`w24S)%姱3%uzVBf?];'Ue꒷**S*ʈJī?Y_ɇq|clWgQ۾C0's4\6)%jʧVm"Žaz c !BV!K~Gҏ]_ùG#30C`Av{!ݲ} \ V !Br /Ze: pKPВC`!輾2R]pW !BV47]|ga'5"mC^~hPm1#B!16I -c9 ɥkUժ}%jT+%sΐ9C 9I ϸTB]eS5xO93`xZX5,7X/%\`伬YXBy+^O“O>;;IBYH;϶S=pXhK匾IL[5t9+Y"2 GO BjiH'$XM?vzPd$𥤧62ThH"Pzq!BfPR*.=ίٞ7h0Rt0#Fu=`03v.XӞ_IB2^tk7#rp?!BHE3\ )Mr~I|픦@D~`c5W0vA_iI+'BYȔ/.NU=gM;%?rFy ` %D-K*jH1ތg̱d|gB!0}ԭ]Als*X<+ =p80o̥_ Tf7E??NcXlIp) !BhtR%lFHw4qzhc_Mk}q:0)U; z?=ktsza$n. 9-D!B݌_lf}H09,'뾕x "Ib בq'҈'sa6B!$[e-Cҋ[ILjU%eaB}o ;?n$~I<ޯS@NbN9 ǽ!B(:T:JW ljdLIYQ}L^4=KX(/t|'H:%!q7KB9I3e2O/OD@yha`AX ׊Aw/:VaB!X?÷"&e3qXh Kڇ`z @AZ<ңB!+fgd tw7Qup |(2X@"UTnkI#$qLy>-p= BȌg%W[DL~ډ5-G1*.hIWH͟=nh;z Y  B6CC4b*8Hx>*ԑf`TtaUE( RV#B!]N;F\?q+&jI!BtI+)w7hx-fhĢ99,[#6Hl|!B:2H)Q\5FK.zQ*k 4B! 9+I `3cL OӒ[.vv*!\<_ B!^zgdq 3))>>UϥC`Cc MKUAc6Հwdg@?!BH$qX_Vl:Ҋ% ѯωߑ  ÏUOUzq=uR!B)f:?,RNF} T9X(RsDrC.UѐX)Ja*!BH!$|Lc2`n DATO {y4uQؘB!P=E9%o4O=AveI4LkBlFO:ҙOV!B҉WeYy؃_"EIf4bMX@:@b|S+kE{^75B!^h>u ZUJ '#0@@ri Z ]B!dƉfOSY1ɛt(suٔ8BFC`J30x5MEB!,2lJ,DJe:OMuzPfUٷ'YWm<,'BY`F/g8Y+bʳI= LK>N$04 WqNڇsB!-ͻʂbA(TR|OXzPqL)7n !1l@!*Я,=y#;{Oѻ1}N M:2'4XRCvFU8c`m3OD!BJtbY`gĈ7z:>M00CUKmV„&ѐX^CƌB!,,H{.R5Y8<%/Q.?8Ai@u{M3qP([wB!dєՋė_J1I"qp(k{v|æ8n6%X 0䍴|B!2Љ 6T|g2PטߖAJ:#,C!plHh26%BY$M:>S{ZAIw%歛J<12'w\=!BJjɮ/;f&i;- jPOG4fhFJd (L %:P3\7I&B!g]D/l I3Zo+dE gs$ve B!7 FZSPe'E'5,PKJxsۆMKbw1I{!B,ɮYIKVވR(:&# 0#8z,16b [@EWՒ%>!BZG:#`PK?z3ʇAX<>] !GX#)B!̘oKEI qCXنY @j_' .A0 '݌4nSf!BPe9M) *$ͩ϶/;2vdq saB!K%^TT+2!UHwl-LJ/=ZFBuF:\6]8hRaD!VJ< )%s3tgR`d+~SC+L;kRO%@+iFCcѠsAƪĥB!$=cE]# y [Aq<d_See-eW-EAh IB!>=\ )7 Bg:,`0NZ1NB11ERB!YrS+. NzwAsPy4;KpMh4RB!hR ;@*eR`ao:;rEvQa;p'!BZKPE< XTT͘/nTQ$s*V%0>L3!BA$2kZ[JbߝɈ?,韰^%ٛk%B!&~$<<  ŝ&!/0 ~d$>M/3Kff$.B!?Gي\5)O߼E8l>)=01ur:3~ !BVE&Lhv/%Jt-S9U=͞$ /!htʊ|9O!YEȈvJ[Y>".&oEBrmږ PKOS!2sHzW4?C5 ܀I_+1:T>"u;<^N'ϛ'rB! ON, $ψOSR|׬wQbNAjB!$A+ujjFN>MJ?-K\8 Q xUgMB! _)+ݒj94ڹmI`hK/ͻX` 彅)J+A!:2,A"-삻 (Hq'qSقu<}V$A39)M#U$!BRg>O&m-9c$?TyH u-R:B!~9 ES)2,AG(thGuAiy>ݐGuX9sN| $h!BƬP哃 =j6ԥ<|_e O>zeqI6tn!BLP$?-"_7/v }4E}5zֳrN}ɣ1%me/ !BȬrϻgBH_YW/"u!h+;bh zB!̨ϸBZ\䞋;O_! @!}.BΉB!bh8Į)zה8>܋wr(/@FA B! 0>M_fCܤKaZoNyЗFj!B,cQ^Wz-+N(aVDs#3{ ѥ'BIU,"[z)%rK:\,=g'$CSw2u!BCGSź=l#S}ԧ~[3tb}_+߀>B!%Q u T2,WSG*QU0=NdRB!dՃ`TàLaKŢ\gF-Vg]mbeB!d)\1Y,zY GbEI =rLI!Į$ oשODP5zvHI)8EO!r)ptJN~ԋ'Z Ywq#Uj[:!bvf> !BuOa0D2+hP߾X" έ ;B!+)w PsJ1| TE*Giy:IƎB!&!5&',[}˗? #ǢImĔ?!BJc$M| v~$r,GDB6Trc2W Hc<B!drgLT<,3ul4_RSM̚TcXT1FWW%OJ"B!V}$(ȕc&/9rAcEiE5B!Fpi>e(cQFK9t2e%;Kk13\ ܑ@!2񽄟ko1H'FJUeMTF:?0bor|K>B!$*&)W,m&uE+;$l:"֭;|'q%|lB!3O*C5ҴXۏBO7o;CY?S +p!B)THYBV^qEf٥čY:U 7giWxX̾B!"T9GyG%[[_^@#Hc'wVh$~I:#RrB!$ 4Sq*<ȖHَ-)H LV1Gizw􌌾;0ed8O!GLS`qe6S$|wPG@bk}ĕ߾YTB!3f]9;^?*EKcG_+i-ٝ=Uǯ8X_k!B)o [dkvޘhذK ) l@95;Is»CY-}B!٠lk":[:= YO.\M~nx1K}H .HLF̄kiM/')JLiSAsK97W7"k h5RF!B ڮ>YO燱#cjD;] @WCVCLj5"B &)?=Q$>EVȚ1FJ#MRN?aJNϻ nk>%`H2)4@!YVZ. 3hUewϢ3@>:yߩɥvIp=h!B6OWeAQ?L%QfJz.\kՀ@Q@${SlG0B! r_.6\Bj'v_b1m-\`GD7'ԞrܙVAY{hB! Qؚ_I7u@٤hͨȓLxgf,h$}<]py>J( !2ߴ5xQ$/wԛmEڀf]@"8#cf2!O|}!Bf, >c LSgaRZ V1◣וQaPi`i#!BVzEH>76< u9J;0n睜u0 xxlʷ7䁄IB!O}ܷ%kN<,63nT$?}'NMU/J3`[:[~ػ #…RH!z?"Sb^f~ὥM#g(>nM*07F9@4Sz !BUQo^GnD_ 8Ù4W44pt B!"yA)՚E2/Ꮤ+bRNis,z/o&!CƱ%hoGH B!bvlW/ߵ7˖OĪ[TUY1;#O9R\/!B3З=KIZKDz# f8BbrxzF_1'B4+keM\_d S@);VBoԎ+PVNQ0 !Bfi+24Rg>rш=C,Q(I%q Ith &B  o4SJڐ^ŢJ/&l 7 ƪ5:[@+u edԖ@BYBQ+YM/ boڡ K|dA=,FcDE~IqKq5B!4N1Jw~ ,xI,AoRo3Rf2!BfLsvrYOA_%F)*]WvKIܳB!̬i$E )I++]>9^<弮$z )jinI?GB!tj'р:z 1tV-f/KmE!N4CG!2K^MKѩ[Q2zܶIH5w]g^yQzAB!d h5:WTp_w,R=J^5@JIENDB`onionshare-0.9.2/screenshots/appdata-server.png000066400000000000000000003225051301215300200216450ustar00rootroot00000000000000PNG  IHDRbKGD pHYs  tIME Jz_ IDATx}w$UTwN̲%(az"(Sѧ `B| !T'@DPKe03;uƪeg֭sO1ABoa0HLjԎWPzwn|jտ] o=Fd{UI^Վrʗk;Y稍XHȍ RzMraeL=)GN|=k2'u#ŷrƅ3Ӂ%}>T{a㌃AkfcJvi'iQt@.IjÖ7UN,P + IQ&Q 5-B kB,Z*`Ϟ1[IZ5v4-Yj(kӨPF56MIMP}VzeJ,7f53]{3ԺER+ٝ@dţ\u9vrUp~q2ي^my[97lfՙJ嶷Q&+;U5ߓOe5ذi ]~Ԩy w&#RO_vԷ&y< Z禟򛄜LeD !`?g]qs)5qW/cKK5 'X5$Ybm1y~ω>^ظQ!OC8h|6uW5ދU+F2-o D5glQٿ޾1uDTc0 4)p]ҊFV4Iy+WD0%M)$W`}e=f%# 62g6MöU4n!I#Bic#ڳlɑhDm/wiz$) prsM( 0CO!R.n'v>OXi)s+HrKJ`01 ؔOAE+mzs+[zrvRu'&c*UKJUFk& H&@!r|kwU}'wF*$Or ?SO&h:2ǹ)Mf=.<]?.S-v(31̠͐%b FHlzE `:'ںcepPp>wǙ*[.=~:"D@*6 N6k2woRV@8~qBRl²v‰'+l 2vZ>sWr DĚ6rT>̌"dH ABP6wkNf6HٗҌ ;gHS[ӎF^岗HLMf8Obl;сRj 4,2m}.P4lVjuQPW7;1t-SҾz&$L*we oLӦ6rZs>-]n6N?&Sd'dd>6~g&b3,g"qL&X yd=C x|o>Z>2 ڋV?^+(ʒuPq|.O "+L߇,$'^g1PFf:2 p)u,XuB)Abڼ V=O.)f3Q{v|AVl0b$2~~`FK_ajOpVfEK%k'fm|T<-MmJ<3''SeX*9m62i_雴C!2-}:u6,섖# նyh䍼e>W? +)*rRԚ;G?[rdm,j6(gPKDB#~<%5X0sD^zݤ'NXrTff1MXK} Y?%y^vykyNlb=א&s63P)}$ M$Mqؔe`+&]#Wu` Ƥ s=yJ&&#\ fNw֣6a7*8&#q'DC$#0T1aaůlamQB(N 8Kj5'!]3S'{nr9QKs6mweHb=nD I"BH*&@MV859Gk4gQ|aJk\f[2o=L4Hӥ0Qb"! ;Bܑi< Ht}fUM$х `s 煮º/71(W-(ltMM.Y oy۰pε5FΡ tFndJngY]);I RE7#o:Nuq?rvň-MŴ'[q~qܒGlIZ!#L,~ӿֈ9\YeO :y=- Ӎ0W%WDݶں "_smEA"y[WHǹׅ_6W@Ul 2BfY2Ve1 vkPk>bIxҵOBO:]Pʚ)r1 \S[XMl'#eӠxNq՘Bh ]gE`“8&C|T.^t"y&U|hҥ7HΜ* ,plfU1'ҽo t䜙iS;< L??IG!݌I1KnG@|Rg}X01ÆUgILӼ}B ?z9*J۔ܖ N2{9qb*@+45 L-s>0V `JRpA@坳B˗4 9S GsГ,OqeݻOon|xds5scwE0~%Λ(X5u۰9Dc&떓Qc:.uPYem>LqmҦi(n &' KϹy$2#e)'J {[,ZЧӤTP@Dgenu{Hz()"Y&O^1S$}ԉq܉dsP뭕8Ҵ@4 @+<Dx`= H"E֑Bb7w l=0SpҴ 8͓ͪ^f@Zg~fRe#)0 yd`MM;œ 9͂n XhMEQ zCNN796[cuV9#Au*O~Nxʩlv)fE"M1Zn,l['sQ 5uS$͋HJ#iY5]S&/S~Ogydyca(CyM=m^&&B#^DIҘ:`z#0OW!5Y4v!7wBRc$IǙ`icmF^6_v6 ދmRU#ׄ~7&#uqtG'G7HLQЂs+1heڪAgpEΉ>bEZs08kXZ"@\@Mܾ2 ȥ"c &?2 oSg݆U{ 8O1ǙƱ128qu٭8plI|Jc6lnr9O.)4AH'ydU-%hLz8|CgP+:-|r!z--9EEo5Xcu,cl iҸ%7xdY@ULJsΞDmQ-S.o5v.Ix?/f%Q`WU.!a3AH y &s'/t5HhRr8(+@vp3v߮ Rgר9f?5X;/:fts,1kTuQeYVmY6hc>t j@ |\~ӑaQӾiLhvF/G`?Ki)U>j{cvZ1.+Hh"%Gt sP^U by5}h!UkǒSalkLDIEa K JO”чIe01TzϦ7 VrRNG$8,^)`qBkK#n~bnXZ0Nb$+E$0;QC& \<꠲eYM@k˚O?ӞVFނYBk#[{dW)~6dIAʐzHvҬNbE9O'd%FJ]4iǥ(*t ifW|ءLXw&&@`I >"92ܖ㴙\ZPсfS={zDu̲\xb;g(( ˺D2hr|v m?417[.U^ޖCeV^1`[I%lZ*b ?'Y2z9ZBNV49n~fo%Kg0GZ L^)N JhxJI@Yro)]NrUtN5䌾fbcdnF=]q, Աu:eYT722. 03sپ' lB6gS(ri[ DM`UMc[+NH,~lؠ٪m!y±4;2eecYB:m:LRq&uX,THm&"塂dd 5vz.;9@ZO)ao}[m%W!+-R+fMB \`uZu!.chf6o'4aǍ@L>X¯M]CX*ifS 0K6w 1pהyݣ< %FI9oT=.(c*wDols,rAz.N +VwL|]Xuʾ'}SHdM`|VsTx|Yg:iuՔTd(O,CgJuh)#[ $)CnTc'd;M%C$J  m.lvKDd ܇e e pS,^.)W!jj"{f@>I ^cwԅ, J[H"lџSdk;T 8ͳZ? wg>T*Mɜ%ړX %յ8>6çnSy2q}hY1?#"2oJN3e`˶ a) R(N2wks#-ς_&g^Q£&'dNUئ!_}x%wm7GeI3gM* ,IXU!! Imߺ/ƬH&ĸR Da(q\9mhV;Z@6Ld-FėU*sɯgМN&=Ӑ5t)YO䦂UחU \lAYȠp%Nt(1S%.Brɡ @Lǖݒcq,4N3P@RFGcRH!9 bcOCs0o(1ZyMu? k,KF=;yGjJI=p}H웏SNK,u*ZP‰]v6KȜQTȽN ^6h^eQh@#V1i( IDATihZ'AZB )-SAކ]{0> !0DR$Sӑ+1`7AK}d mSYaLe;0PT; {(ΜyR8>ܳʌP39!فMn\"#Xf#W>IGXu:go݉Zw; {\!RH!Vj*f @s# $ F2ȱ8H$A=j z{h'V.mƩ\9ʏkJckjlK'1i#LQ"KOGqOt1_Utr[L hH*a!%iǖۜK X )B 8#0a  0!s4́"OIL6crkXC\66Wan6VC }:^gs7lj=? [ڴ+yib'[6guL֟?cRȱRH!bڗ)B>Xt!jht j*h\JF&>Dž(u؉hW+ϖ.T+6+M J]?R,C[Zf{J}~4,- ||x5d"?D2~<,E9V\(rK/-& 6,uR6zj0bx0 *2tDcleRH!bZ" o@`+ !:T[&H03#qGD[ s)P7V1)e(\y u%+""ƜLb}ɱ1oŗ-5άȥӱSU]ɀlϖvЋNɷb6i3b}#I,>˳A X:.``d /'Wajo7Li7%K`E흎6o\+x\?04:1,Zj+B 05Zp4O|{`$QM{zfU Xi3M]y5-*Ǭ:LqS)ޛv$BL .:0g&#2CTEC _YKkVE?,L"G>DiJRdx؁ />je[ub1i`3fb^q$B IAB:D(!#@Ϳ9ԁGR3hSMIHG~dGR2)U5فgɶזy1w?Ab7$@M^$l"aI#Lp3Dt 0-[leEwX÷ :kcaR -߮x (ˉB&yE!Ca0a||r K[ aXвA{7b>ݰ044JPC[ c9caOm's8R+cú XãUL-oCNx>oPZA )_ƌ)5-* Ysg(:  H[qIz +Xƞ)6k_ [ >=@yTN%އ߯[$'a| @R$)WTH yp'^\B!#0 㑀ZIƄ10_:h :֪*ɽ\J\036jjRí߄*C8H8M'킥3';~355c׀Z{~oQ;!DihC<ǜz k1fʇr7'A8 'B )$ p4Ȯ_Ү*| ~j)Ig@ye%x;7%,S[] kɏ3"i_N!q )$ܦ`< YNA5ophl݃QԆG53CUSi^8t1T ;:q:;;em|ci*Z vyX~[oM[a-EFkSq|+!5|h_?;̘q/altհ~.JSFwW:J ߹}7Rw9@_F7b_DWOvE-2U#t#ߣ|lD8b#&p':bP3r1/j&M 6UU,*W 5 ]ӅϼrG|s˸~UU_B8<؜ы*SP֚eWUtvNx܄(DWWSYׯ׼GM[ԺvW Wݹ{Qo.S: #:˾Ku@8cb== ܴX0T'O>ٙKqȻҩ?!6{S0LŲ=v'c0s l%h-@8脏?}zu9 + ۅ9;5?~#ԍG쉥eh`6a' 螹 L;WZ, %H#DR配@*=?v- 'GR`9Um8<u$4U:\(%|96iIl_VYu|@M9ܧNɪi2Ǭ "x[$c7BNXQ 認 n}96:p®Wݶ.ϣ64BH#4>8|]wkؿZ?\$sq1ڃq FGLEiBhD?~sޙ8_IKϫ˞LUſ>0g0ug'.cނ%˽'kn>b+,=t\pv{@Gw~3g'u N^ډ+(z{{;.-]3G6, vOKe<6J{#gx}q6.:e;}>O`J>RCb?4PPw'q.[ j̞1 p+?qv,s GKsz'8 >^2܆6yE xzkx= Ki`ZW,=)3=?$^ñPQ!a"iM> E:|<Spl|b l:IJ _Sxmv.eȀo>~@B^ Z! HޛtUpP*xb*a=?dž _~s[i]/>5ef<1\CTn]*@wwg9kAJ%cYрUeHuSx D~WEOOFj.[ݤ%\}$uz;]3增RsKuߟ#?rN٣{z\ʞmg~n7t$配Fexc+8TH![ h40sƃv8n\:\`>@WNPFхg?gr8;$/Kc+zĺpd*XLLF"qpkD߿(ޖc- e\$R)U =;`>>`?v욊s7mlJT*eZK:ZvIH Wv*WjU[}{;>kKN8 ? van g'v슣7X;@u%ZSsZI6vaݷGSc@օv=A<;۱mg#CR<0\}n3 Y>mRE%m9ijFdn|G;ewz7 %}VguïS9d51/|`R#%4542'\9/ڍ"uR匜 Ege"4k:ДzO&֖jYz ghok+1ÄE%8DF,ڰo=!5 p` =z6_g M}~}zz:e-?p eH[W p>k~9zh^\{1aӰ_ÏO"5 %23< 3?a56<5`<74 ;bdݸn>W{a` wQ\ba[W )d P8AZC*Ⱦh92,}c6`%!pHNK{+Ա^,Б&E4~R0a8x:{w:ݤHM>$׻Crv28Ӿm,?t`rXvl>v|su_;@Z5ǿ6T p X]F{G[fBmxnRKD9O@GGZڗ֦.Jƞ8` Q{a|]S;1Mdvqqwj}O_\~4][3'|ŘU;c_K\{C(M `kJx1bFhؠqtu8=tz +*,5B c9h L¢,lNnx\((\IlJ4>vPveŋ` &H3,[_bq \G6\l{\!JH 2t' &z߄/z'Y;'@52 aݸ'"1K5hx5Zƶƌv 0g0>2s#Ǜ6Šj.\ۅJڴeBƶn&"uó>I)E܆!FQ 3Tz ND j1΄m062aFO'ƨK26:2 Ύ)v6^EtL8NԨ#5TG6\ 0`Z-`C#ڨ9])j*-D0ČQ"BDD"G/ j(R ܄!N(qr Brڢ,r隓eMO6`E29aol9 }vY+|v5NfvB.:PޝsEL"L4mjG&*2t~ލ enQ`?r E}\߆U]fX P36:چ|TC!8ms wwކJl-ktt ];°QchhmI-B )?0>Dʨ&O0v>H}O+D0K`6m7#$逾 Ekr%M6bbJ"KK ^V!RH!c@Yx0|ͶѢُ=Ktph)gH0_\N|+ky|g0CXX%RH!R R*W[4vsY "R+=e =PeDIx&Or%?Ρ g#$"p\/TS= (߆lvrZmYi͗8失=%OLqz eЯX PH!RHz 3,F(BF{U4M"< }k9db)1%+{"KKXJ 1 .tRSFCJyKw.i> ,۷,iQ#rȍg Q2Q6[ѶNU-_(B )$hfŌF(IIgcO7b a Fjd~2L)IH?>cśa a/ Jh ]:e:x#2t#d$ N1+2KЭK)\bCk8[ǮO2ņ#DHUfZ0' yYaX1z榾PkgM͌ovVOЊL~v:J7X!RH!=Nu,q:6knSN:ES6nچ=].ay blV [ӳHQnʢSy@U!I2m Ŏg*b6J9>^.veBdXH#Wx['Br-  )B )$S*Xmz^i0b 'H ;yȯ8384v%'C+L|ϒ3k# *tI*>bghb qy'}8+}ghe X+D B )B2~/ A IDAT kꟐ4,#)eBяjRsh}aDTR3 1,1`R7IO2S0TGJ:-d4ĚO#ӽld`RH!'*P6퍤OMSMxVtne"V+O9kc{pjQR"J柡 ṀLCo]4xۮ z|'cA )B )AppbFMf w[uz]4}kɤ!ekSgU9p@B( z蝬m c)֟np t`?Eǽ{9M5YB )B ПǤsQlRO<cx,lf`FjdC3Z}XocELHV(C4PLIL *$Op-TRH!RS)@.l6E|u0,oG:A+yj+lVC . ,sّQDF'A'QYb,dAlbv+lreF/B )ol;bڲ;ln"יN̝$p9qWfo!FveMpVQRKXfWb P_AMtI3%-E&B )B6o^SB1}p1hBYzq>Q6%} ۣQmJ%)/=a!k.e&eĀ` rqb YjLj@_wlJbe Se\m48m_s1RH!d8n@*#rU^v\L`@= iTAu(X͙G#&M}{r(2Vq2S*!qM@,3Ö#77"kE#7̄"J}Ԉ5Jb0;LJ.#^ӞSiCGr!OuCoH!RH!bݻU>'m_h糓M {tP}-Ajb8⧲(}̙/ &* 4i͒Ç|2 AQc #V,}!#ߺ{IIm~Jw i&h$/ݻ4c2kF___M K )B^VQcDfDzU'e!ۯ :a[*ڑ4ӌQGMU_Ta(:-JELHV Dc> ńa 0K &ŰMBhl,ahtqgسb=!M+wH?6@@i32}d]D C.RK@  6l "#5kրc?~RH!x[x\P{PSGp8g7p)#@\>߂83F)Hو)LckgUR)fTQNNܺw#+)F: &8OZţu!%eJH A->Cy Bq\)^ `j npKK\'ID  0ZV?|I"H6B{Z>h49ĝţ"-ª08Qawj4̙3xᇱ;;j!R'ь n٬ ЇliB$Y[.2Τy!F*XYTFKHwQ$hmкY"v2 5Y4r$'#B(Rn1xE~ qKTM,S+R#3",81Z!Rc- :`$B4uoaP0:PU *x>E2 BwUe?҆!CWW:;Q*pwVj!Rf/r#jP+ R5?9|MI5A `ʔ)QTaى!aذLb 뮻|b-B lELĥF1\NQ뛧mwCk8ʡ}tiZ)hZMp +_zM.bcxKb9JQBH4b' rI8]b 'UZ X BZM);P~Kyp|Jtbz\ e0N!}T7HAVڵk?0jlذj x衇.{l!Rf)8QI ;g57a-߬~8Ng+gvo|$ s'=2[b/u=s+G$SPЉ'yp.$LpgGWg`ej [&x~bnR&/N ccčJ1J~2-Zjz8v'K:.rZ[;d^LSO"@t;zrwswQU›_@V{:Cr ~Hܶ#a/?嶨BPHRd1 쫦 ȏ0d% .׫ ؜Z fq遼䇑S@;c&ny_VX21"#SN/~W|՘LV={a:>`:C`ʉ8q(9m7\ y~_7}?+N^Omi[.`{'͓Oz`[d.Og^9;Wu'+3 c(^V(JluOQ&e=)LuR' ܈}e @)gU!2@0[-Xzіu>k? {6-8.8yT\"t-{B,ZJcӶ}5E}qֿ#l 7]?Ϸu_3w@8~u_Onz`cޏ՘[/7܈4۽-8O~3t8|?{^AǼ/gXCSWhx]t7wBϬCŸfo{T_D]+F6Q@PuO h65:\r6(S $,{z0\qe8{d>nSGs-F;VxW%8~=]{G} {Mg^ox7O¡|j%8q!*6,٨ Mj;'B6&KRD0s̞V Fg ˶16#-ub=>3o. Ps@뵦SSt"o2#'<+cDu곸w /Ͼ/:>uX3XP̝{:oX:/|WwO!=|aa;_WQ\7 1w/O÷Aںqŗ/ w t/88jZC.e+9x.dz7~ᄌSoiāO)yuzzARs.{q۠L=ga@CŇV2vk6V=x:sK*Xؽ 㥷~ F0];ݸ;OxC0uf~;ȁ(Lh''Js#bd1dd- m9R:g5i8#YW ȜX&3LOӐ!T'۟o= > /0 a@E### _,3UV{DسW͗\ف~?O^;}@luxv,,˘~yʻ PW;S߉O ̦9ek=F^}n^[3JoN|@S´x1Q8CߏϜ S{.N}ᙿ<3ǧ Mƕ睋',WƱfe?m6蘶-p—zN~3t?W`DvE#` > B5p:>c՞Ec^ m7^m857=yG*[gqU-)K];݋Dz6so\}ZܰE,xlx,N )d:;l+L{&KF҂S (AEKɮD8) B^2i l%d灡{~=ƤY$ב7Ij?%ɂ>#ȁ+N`#22F:xYsȒXoP:cv0@P;uo T*x% ~ح!ypӱ˼~z?#: I2c>.]DWiv?c{ї݄Uޏ?4ƒBgaҥ⣉2n&Z>\`ءqwm(j>8h?{>nw-5ukYb~bA]60x|_Dߴĕo6Wג*֭x ڣf#1`xIo0kq)5 XG qЌݟıC;owt^n=UX˘:w*W/pyoq|(5]Vۢ'|Oӊ#B r PF뒚K6% H[wZ@HwtdmH3h L$L~ '>IZZ&kn_)aTB\TICw{6Oʠ,MEB@^XqT( i#0 "pS/JM͊s,܇7ր4#p[ fLV]{ 1MuR!f~l]i-;s=ܻrIbm=8Z,$OHH!.rwɏqNÕW A5UM0d`aXB%°y{+>+~~4nk?~ NB{j{<>X[~4u  aV0!90k~/pϋ*6c7vc8+p{ Sc64w{/?p=yM֪=[ЏU@W%rL$|x"!bTwռSV$<c%{G`ʕ+"VOW=0PmaoK[FuP\a{dWðabE$QÚs绳q؉%}GNyFҷAmƗn^+<\Ȉ>Q_2cLo%DNiX].<:pO?fճpՐuLOڶ;v`;"j'qFй>4 bOpzX E>reTI l`l!a4|=c3,pvL p }G1O^o.f{qA dd[lї6wq [;1 gpOGDz3e}}=evݮGz=4cenx^)+ߟA3qi?uᣟ)G*Cxo&ڭ//Mk'nmCCWG#k77=)ߋ3xO+e݅p![4Y=UQY-\MB!kYGOWJAHEr(%R6`Lu IDATd"  G7=>(_=}MYGX8f),4DĈ=JȽT*iӁQlÿ ?v]k.>3ƛ?-\Jeoua_ _n'qOö=A.?~i.M9W D;~|XpY| G 38Kb |^|ӿtny|Wbz;_o6CY鈏/A4!1U]o7y"nzpͯi0* á[][~8m]}{p^|9 pq@o;b_t)>1:gD%@۴1\G%<Ύ:;=whIdɒlɲ-wc6Kžb!$0[H@l 6-#ɲ%kfyt}gSƚt: Wx+/.Cq/aK/>^(xN䠘&YvW Y;wlt "$t " 0'88e>jU5/ZR_q9K% V}gA8kiet1ݦYH2 Yo3!#݃K.{~8QG~)<@;]PJpLD ݸ뮻pWz~ ^9x7>Ο.^!t5^&E]~L9gs{k?]!@DB"B D#O7sOZ+?6I xȂT;:efֽÞ,e~4æ=VCBl#W&]xE_ |r *Q]@x?}Kg ziGQ2RÒ/ƛqys߆~^/{9v *of@(* @..>gʂ)IxWgw`.݀ľgUJT>;f$ J>2QC^:@7SK] 2Gx+pߴ/z;^dy2 UaUSO ms݇vk\5I .s@g[RYn@,vb)[+R'8 C.ौpXۧw2dJzA$cs 耾86Wmku ׾\?^2mQ#,((WhCʔXcB8hЊ}HI $R Dl k es8 7TtM AP-0~hYba&ܲʩy )r̼p'WjS]'je f] 1cFGG3x$_A[F BIКb kG,nlo `9D qX_lN%k;/;EEv";WDe~gd .;WjJMQ]S'^x2=HB|7|M,$#pֶZI%@& @tad9H(j(RiQZ kgTMB29ǙT%a'ak敨 'K0v;Aʶșr~<=ŋm`7 :g 8DKO M-6 X%/f} SD<+9ji醕2F'ɲQX^L[[E+n15]tgBm0XU][NQMw\<[&US8 C̛7OR͛׊ŋ/W\^PjH!?g u(]t&f r*hT~jR@p1e}*tl=$ mNZ&Y,v\qgSΑMI8%HX9j/[SGr m,mNQN=$HvSҹZQ:1EytZne 4VdX'"|^x2a zPWu fB_Y $l$L5~u>ŒV8:U HZ̷|m TyUmz2]8ig%,ѬB4›!( $"1 IɇS-(Y dMHR@`q݈ڪA&Dɱ\K1Ts p'Ɖ̙3ǯ|^x V ð#QĠ$E `E4vjS|JPv^I*fHG3R(A{ۏ.v~+h "jQqz$ţ0A[Mrƙ]@'9Vdeκ<.泧Om!/^xTZ-{&*, :0u 1jI.2Z# uݰuUۨҩ,]`6ɕN@ xwŋ/^8I[[Kog)N,^@egC&H2);ljGS-ݸ4A|}bx^ ,B+ڱw^xdd6wsF!0@UcH*A{w>Ȇ@Rf0)69`#)]ՊW*"G% ,C3DAr-o~SpW=XʲgCNҝ0 ŋ/WK6vt&ʒ 1G [E~.BZ G&(`u0ͨXf޳i+d}f.:XncQ+d~XeG3q$^J.²ܾOde|S[E6]-6Ҡj8UϚ5 ,ҥKjŋ/^ XR6Yw A@v.߭0hC-G9y$IﬢZlmj>pUkπQ˟o;Ґ;nBNF g:6cK0 qF\r%Nܹ7nIJe0s ^xe~q] X=Y+6΢cMUf1I,ZlDJWphq{&k6%)Oqdy\]Ԭ+RHW@C:FGGGq?XluV=z4ΰcߏ˗?6^x2DjR28ٺ'ag5lz1RYŐvJ5놗S2*yH=Y]wO2F@TqٗK_ "03c?3f',cU͛7O/^L=kdS+ĊЗNf <+'wEǐrd<sAݍ7,Cv߰ԛ&>ڞ&O<1.ת/]}իUxc+pbwn ^y[g\߿h~Hxq.q~QOe=\n #ߢ\It,TY[bs~V+2WPsy^䪿lcۑ⥠Xa88 pߣ=b˱Eo67< s <㥨&Pwoh l?S/j*&| oWc00-?7|W z 4aQwI[Z"{#")]*-pkYABĻs\PqQ/T;؉@j}P\<EY2 \7, K2y˞ xϭXtzzA(uuA(ixn6al8iu(>c@}GG@##1sCO~3+kW,n^ <݂}xiU>;/n'~gʡ&,{wqA ,Zˏ0׽|-R3wN9?} .^܇_gog4H/^l? 2kI;gbf!KKq)ar<>W~ؙx6@}%Tr/`Id#n!+iOC$ @![@]]1"80&:шz=zHm4@cu7@{v}+uz>ۗSh׾o/;晘ȷ_xrǫx{;p ֻ 7]Q߷3N= ?yC݌OY+p#;!F0p羌{/Λ)97)svF>/WVCxra~λ񁗞wƯ~?]8-^q㗯ǽ!\<ۿ1x>_5(ŮyqDQ^"CPbs3GqDOh m5.B,("s#TDNrk>(e|XbV7kug`MW­nn  ?""ݍ %Z&M0 pX  %pq;K/_u >w.$-7=^z).yݷ} 7?n7!l+_0lGW]ܫ/l7?>̈:?>1\Ueޟ?طoл/Kk_GF7[]xEkq_= {\5{_X5t'~~?^Lioe-ÆVUrĹ`E5ڪB:?1~#SQЄ!G=&$Tc͵X;QikSjk^캒 &I3k@R"ir]H\mT6 wt 9h6sa]&xz 0 6\X'g?=7EPkp[?O}:|C[~&jma5χ~4;?B9O}o.\zn< 'N6]X|zr̠l߷޾ pEӯX 7?!`Μּv/9'aۆ=hC~ܸ o{>M}X"\k_݇b݌/k5# o9 i8{6޽cMy2MK&sт7˦}V9H=^wm!IfRpA-YJbiu L a[K"9MB`U 3iLp3FvmX{jVS&WSxoԟed͈0.ʸ^5/\Ƹ :f[4SpuP#:Q\c ]xWmo&xt8ku7tx@p3bm_%F/]Dj?^sNLmO^`EX+23#1+:ԁ 28ye|I $3QdjO]Q؀@u;3j/d :W *W( FPI@II@E1x(;ݞ)KGL`t{0G2\փj#ɚ $!k(QQ+l(:16ZWup$=ͦ6 F zCu>Fwa>wÖ1`׵Shb9~/^{=nv̾Q`l>` _9KZ5?V|//{K[O[4=: '(1|x>}t!z,RO +<;'YM?x^X_ y}8^9/>ptu/WO8gD=0/^$^]4Kמ4Ȥ6Xȹg5(Mb4BrldTKϞ wɜI&v-F4KM bװ>w-t9"Pv WH9"7hhu {A2.@7؝!X􇁱1h Ƣh4AAwsuҘf-B|W]x7'<=T8?e ~͋xǾw|}H;@@06T}6]߃!ƒ5> ԍ{v(D7ƫv-{-Νga$0 g @7N|p7>Ofv"^s03fOa8L홿VŵN> g}v]эOy:fpCuk ,=*c_r_q^5V;guv߉Cot38cs[ŵꧾ/Ye޻p.3aMaw _a㷗zgB:PE]߇ݒ˴'\A/ं<[Ez"-J<$B&,6Xp/{3e;Et?CRt5z׭ BKםѮ9|]CX Orƾc( IDATup3v Fh4A&AO3~5CMFgS]X0 8rgNsN>RŻވ_ر X:{%~xWqӬ9]80v'oės;q;p/Xyb ndsӱCܽc>^||bΟ>|pr/~r 6?9n}|)N܅z|g_3!x|n sl^5<Śs׿̼x96mx\g84{97@-ىAYYߣvq=m\ZFi݆rLrT1(Gca"I$k e 2̓@p0 nPI2U~`1o4cߌD bjFQ7?_ |bs[uX|pڋ}gV }z5ߎtq^Wq ^#>KOW>~Ȭ?997@w/6X5[O?é:W_^oD'_46b߆wyw/ÉbI_w 8굥8q0f0332Եr=KDgVp̍Xt斸+qͻ_Ğ;n#}O-/^E)៺ytty1O'*G0XŒc6|BݬBmx;j*V99J򛴈C-rHb\R eb e0q(}j,/d9=.fpwyFM0J_ܻ}{peϖ>D=yL(' ?'?1 zk $Ftūp5Z~ ^9x7>- >7g~7\}fe݂yFq\~)jD.t!@_D)R DqK%  %DbLr -P~ʯ }h!{R\tZF0tpI^ [\;.|oī`?-dZ;޹,:n$?gҏOF ^e F렱hL7@c͸pCh!zհo~N G28u"k=eJ.I~!b^5jUלV-Z|S^۟9&&TWXϟ gh {Q?XCXƴ‹~]M-a C&P1v*ڱgI0>Ao?HfT * h7vC!v2(L[@(͐?kjO[s\A?~WċiY03\y;Qjz]ϟr$'و%I\$uf"Zlnoo\:HȩN )vLUx[buD) 7¦*Y^][SEq.e0Wq0a#@ь?38!(dpLL =C־o[1A:$}X7~$x9Fy@֒}TYSoKIbR1ΙE:'˵o\2i0:BN}4mrdQZ- )KsMbkf0ZnDX R0|~a@.~BcDr@.43_?CT(,\M>UEwFhs ' ! ,,; ;e`VwxQ$&o~`$vc"n5 "mc2ۨ2 ?oxɽqtHXD nn{4 ŋ/ǐ@A^d ~[߻UDM)b",/pLN8[",6l}T{g>ʖz~ݎr|B~-!?l!KrxR8hiJ i,|q|[U.>T0g͎8*sN Y#AaEV] H!s1Xl$6Ȝe[?GAv6eWWX/^x"8Kd jz F2-ޥb E)ۄd uܔ'c@?6PEF.o5 [)3pPa4KJn5ҝ%Ft& 1wLvW2Jww7͛=/^xh&#O(T_@9FQ&s.\cJ ߷R?Az6EkϟKqX:>"; zŋ/ҪRa'}b$lM<,P,\QE5M6) aQMa= +57壬Oe9~56|.ȧYSؠb*}+m.YMYuUL*1 n}ggսқ/^xR/V|}-E(*zJ!= Y%:*-S9gyr(*Bꯜܠ=ZU(#mc$;(dmҁVS0[&w)?|la}El?@Zo &w"( ȳxŋ/q"Q]~{CZͣ%#!31'-fm΁f zW2np^슌vR"nJ4,Ӎ!@0[tJRd#e`] SUmLdDCM`@h vmP%/^xE *yV06KqI^"T@@8Qcol-dsmEjZD 4"Df'`0* P.-KͰ@p2ԝ WE'x$l%lGKkÃer[zTuŋ/^t q:ohr*i[IMbF܀ZpK w&n@'Ga6C殘 T:AuU$W9R 냌u; ##%k雂)Q>)hp+,ͅ{v,gșiD/^xODbXչ;G6$v!ѥE0\}*:LNEOznEvX4+¾b0v/^x2?({.jKнy>9fa? ϫw@AЂG:叟6RS:@~(5OuqŨ:^xTYRȲМuH@= AoK|RsSV$q7BӞ־ͮ-¢66M(V_ȑ=O)DMzWn̋/^xe.u;ԡtmD}T81gRW_$MH_rfn)C䄪tH^ԝ1zң%Q9>%" ]Ļ/^xejK~l\U@?Y#~ u-mATʞlE#O_ ۞|`> EF"݇zgDŒ+yӖK{ŋ/^tt#IOHKOn܇bߑq(w<:d˘eDHpﺿ msY7pdO xŋ/':[lP xU DJ0\7WTX#9O⺑"⤃G\ςtv>VWsZߩ d@7lVY"uL>P<ŋ/^'&h\]l6#d\7-/Jj,.T[KQ^md3O#wƞȓ5)JّdB}bUl=K65\s\`=׮/^x2br) NZ'Ų͖F:vN[7ÀhB?-;쇶ұs}͗U@;oMӤ[:^R}XJ(jexK%hg1-Eٳ"?ŰŰ'o~zܧbB 9Q9s"R@⾓V$pcVgKgu)rF ¡ V]ؖK v}{5R}KeL"{ŋ/^"EVu3*IXH;3 ,6c +pZ7sүZsD (W{!Ļ+5[ZLvЦ y@V6:]icMK}( Бk@¸r(Dc؊|j+fwCrNuVU KC9来36+\㑷#/^xBm9DKt[]= `ǮhM32Xޔ,އ6a;]Ff8Lȵ8K.ہtFL ЛЕH`8/}v|0^Qz9<]ŋ/^&0{ӿ#/x%Y[Mu$%t%Cbl\@2tgf4 "ww!؍ܳ9_UG̲^Kv*< ;=yO#Yf:]ÔEamIdٮw#bp=(CU@SjωLn䣯ضRe! 3/"Tjpm[%.ْlOA" Qr뚰# #M.=o|S@/^xp'?]ёarza]uOJ2_%v6,&cS}C$@/ \0XSZ,YZb̬U alQ\[R vѹQNMO=ł| yYƚ,Phۦ\:r0@]RTq@s~-&EJߗYFOn>c*Eޜ+ŋ/e|9$D-:uKYr r|e N6WEuHh|݀F@^rhҗvMBT4h lQ{Bŋ/^5i9YYD5[XD+[0fT2[cVйGK?#besR֩]K?FԪ4J{(a)HD ېn5UveCs< ŋ/ӋXC .^5O4i\Ob~h"uDBU˙й`fsR{PIE?9].U31cd:"!r/woMй~xŋHt2_8/{M,<7d@b}cw95g5Evq. O/d]XG\\r]/ŋ/^&ZL8]5y7rKFȪ:UeMf/6bMY~Nrϐ9cco]MkN"w%HtμZ2 ~N'bb^9fri6rzŋ/J"hJT!L)Ra fu)5Cq tLZ cbb xT?nps+#jx.YXew+TK}5 i3N ,TSxŋ#Uue" DW#}~"t8k`OfvPUJ$Tj"vqJ ?`=E,IsljyyP# *1#315\܆>k Na鞲5=ŋ/W)r`țIhʸIO_p*Pg)KFw⺣9qj]wTKrޱ:BڶnGAG(\YuO؉# ! ,rn+/^xɁjRn~JLX2\X [J6MV2tJ2 ;ŻZʲY?n?jUvXͶִmA Y yr9+/^x/ 6 M4]qcܧ< ,Yo˘a#6fEj x}rwۙ|R$[6Xlŋ/GvZ@x鯞?sB X^o@ǢZLj[s0skd;3vto IDATeŋ/^xk2b{؊_IJ,N($&G&PY&֎xŋ/^xQ6<[4d*YPΕJp CpE:^bpdҁU*L Y̿ `dHڏ@/Ƣxŋ/^[E![+2wHpMڣLD{ y9(mPMŠ2TM6X.䠍lfUzhɡVTrP^xB^ c҂}$tR` J0a csP'ՎrksVm]|&:ط_m?(߀T̋өSsfM@[ \zŋ/^w<;` 'X1p5`uW?#.5xI͠Pժ_"3g/:k6+Ġ栗z ٰUȡ<Пf atxa훁g+^T3H1* ~b*;JT*%] 9N#M9}Wo:<+kgKۢR$>bW*pSU\m]G쵨yWգIHf-Fwooţ쥓/CVŁp~̞7{=:uAIso~K3яr>/,"iE_2+k܊v yMD6jGy8V#R9٢M6DUaˬyZá&nIi%G4}Q!:eč ^.-\:,88:DFza8Hzŋ$c[p"ٵ Czu׃\=pMl|jq/Vr5bP lb_Ձ"]7{j?k9<=V4Px-o*Pqd6w+xlml|9e^!ȼl D#9XriQG[H"y)f}S4V(A.]pܢ%h6B1¤-J{AL?.tYkeCG Kfs'r}^x=(n9jPV[04W3c\0# .5Y3vZmAb:OQ3e5pS%dePz Y,hh)y'CnblRV6%>-, 4Ů/Oq|˄B5 ^k- j5vFl]iR[&nm݇!V?@5W=h4^xz~IWQ?|J-HG7t[ zQ4S:p&'(BTE+04`ڬM򧵂:'(:1< ϋRo942 gf0$ z!F@7>OiңExOA!5^xzg_uIDX2`vap %MS[7J& ua2IrF H,e&nq.#% (9j+:30u_8`L&/R p/U1dP/B!1-gKOx݋Ǥx1l:<6_9ۘMBC~R-G7)ai'< w<60vܱصij!^WEVft3AkJ|PA19D 5ZlNgt:ͧy\Vջ e=q5uK!G_cre)&qтEr-k og \ÃCqa<&<7nžz~GO[# AضF'9hma3hMB=pkc ǣ;`8ĄցJ؎'FnN.Sxb8ʓt\K 9dpRIkg,2۱ kz%iI>%:~~$4(P^iwdL4iZZ!„}g-;BEv0QL: &(]hn2s eg‡w~VlUx¼0^8^u$!X= ?خq]tKq`f͞ e|q޶0ZI溂Ѓ̵1l?pi=++/\!ѥ}*Oe_xv> zgaqSp:0] C^3F 23_z{0z /PA i<Ŕ?ZsAn^R7(b![|~ZTEmu:ڍ.<v'!9%{¹R޹5m-$/iNH ׃̵q1CX׌qkqn?](W c70r~u|xYǡF'c=eC:D[~OzyFJVRTpO= 99ܝlT2y6x&5)RQDm^$802kPj^UYdW( nΣ(ݗ\霳R%BڸԷ4X+{[4ŌS.9CyO-;s7<Ɔ{Cj96 Mp_o#~̛CMpSg3lK6\zQ[G~4m[ I4U&G7}[\=O#Fʽ$>t.\Vn-nǽ ^ ?՟h>>ی'7X{q#n7cXҝ3ǝ0!-jq*گYݺ 4;BJ>( Ǥ%b,ġ'}d?(n>sιxQ޲rVCalpR}љXu[w0Gp|.X> u)hH\JY1IYr>Ճ*Ã!bs朋o~r? ̚Cxx;~y˯wZ"?E.Aq'T\pbFLLY`gc۰=xy6݅]wsphyz6qsqԍ59r= hY?\ߓ\VXWLK*)b=e`u"98չ8%qN=Ŕ.ҭ ~Ur ''G";H>n4F(ecآ3ֶX1֍9Q/#΍\`Ɖ8e!ܷIؿ `eEP\ muDGn,…|E\лwnm$|0LNLe Ta sq. 1y;<OFэEc`/0Mf"J4T2nhy@t>.|Xz!<;K.,^8~bexNڲ \~ZD#Oق%XoLZ:P=f;PlSmbtxYb,4ܲ+W ̙9=`w/ȮJ&Ttz+EK>)Ղ2@ u4(_*z?꾬 ~ ?iݩ# =P"d4^< y&<?1B2u@q+L5+#X[eG?@AY8X_6lۃZnf0f`)q/7aѥX=x c%sjAޭ{3Wa^wOe(`VrQ |haH V0FeŽ4,Z}݄KOիba)yEпeE APh>I 矐P7fv޿#=i;X:7{q3XG#۔8:XO>t%5$%g3=?> ;o)_vFCF4ɗs\oE` ,y+е\<R2‚)5zY5};whI aH(Vr@9 Wk&aG%9mHu2Y84q>k/eeΗ2PF:  ̙҄㈨elG fۇIkgeY]k - g/^#5'?Xg;6oڄ{ _眷T Bug9-#'eHn9¹v>Fbv\Їx%'פf1A: bFM{gl]bf@9,z0H$9dq 1mose1_皌>aGxKMNGF]J &(P%Ɔib ^)D_IRTQϾ跶mdbZ[Ic:U(4qp{f?̙;؉{Fli#\f- l| Oƪ~_|UE~=s;o,.3. ,<g-\7݂ZտovբaȠ@&̌P`XuD*k'Ӷ~{C/}X$cO^8Zqə pL,>*,Xlx5z|t3@yϦҕc,`ǁCeՕ}P :F!0ǝrt ۜ'@-ƊRC4Z%!O&L7z1hrPǯk$aN R)I_ A#{_)8gL+J)_^a-2G ~gB =Ʋ ؞96'.<%r~|ٷ/Xl}ww~ N 0̄'G¯vFO[3=f @pNWz`;w5_݆{``(5c٠'Go(AOPah@Y]RP=n]1 &u2Þa\q jhЃعm7^y:9k)XmwaA8q[Mmhwg0v{v41z)ڱ50o%8{aՕlvng;;0ai˱/B=q!>#b,Co .$_CI9AJ_+d!!fʄ p)nul2&LڗGGwGpm-eŋ/^`Bw&#%KRiqX)5ߖ)Ra+jwD͋ s%QNHKy`_|/^xX[#b1pfc6QmȮ4Vo?efFzEZy bό\_gy_s R|3([͡RI<ŋ/^xPRZWBcYЕKw`b0\PJTcݟ>O1diw~}~we;ssF{ߚWŅ?/^x1(720鉀p9˿ $@7j$ IDATDWM{8@9:۔8'qmP!Tܱo,fyz$ !r<=jO|rd/^xVs3bh9fh LY}bn\[q P&žkztOwN#S%%-ɞSj^k e1yBŋ/^xN$ WYl%ߏ+=wXIj0S&7DŽ 9-Ij**&i.]MIaitrwi Pjbm;ߌŋ3؏CODvx⥌j5̞=s#VpH*ebL0J!Jz=6ØHEЮ d$Hs1ϟZeiõ[<)XSsg]݊L] CBjf6E9t7cر =Xf f/]ҋ/^Q'9m ߇ \ЎgdV |!]-i=IIwt~ʔ"caFh:~6ӎҮZ_R^ˋYaSIZD)d`9u^)ouDKǨ9vqهS80^? 。#D`}Xs̢}_;/^x9&1D>df,=a9ް e\\}A#EDH`*Sذ\Hؒ ^YaM-|^H)CHSv45^Sе\քͱ ¨p4PGXa'm|C,g(>]vɰ²(*ag9Ǚ|Ŝ(YA ""JΒ%i?&u3;]]]U= g߄j?_/P᢮0W4,Yѹi"?vM綧>:%TR/hfx9=͜[E]f~ $:+CM`rz KPUtoVMKe0מ{">teBv)X'lR%fOŘ&Afu 4;:I0aRøpgRFrZ1~Dk5I:R?u>.Af~WwIETCjcҸS{ nפހkLbjI{q ׆*.BepGW&mmX!gkZ|),mJ0'-usJ=4TS(yBBrA1JT HGq}AȖT(R*${_װO辄˧a tm#\|mԟs!}t/djؙb*i}6kւ9/JPMwRWX"}y }p(' !\KIPc.(wfY{^F3jBzlGߤ@ MeD-G/>^ 5ĎIbNkǫUᖇp)&VYn'7nV.+iQ%/#kZ7iR d ќ}WMrdd_U#&ɨG&!rA ̀'%ePR^ڹH;@[v ajT(]u"vN}cE2$w@1T׉w0|WW0frLVܸSz!\@0iUGJl|lk|[XSP;󟃿tL%g+SYz\d/X*x@*~b/rp_ oE  *׳tjVSxX*jZiS**D$kOMRꞯGIaET_ZPs.u_uwr{1wGȕF^û$}}/[o7cbGY+ O)Yt&…,8) \ y1ę܂͵a^㪯թ\;5mS1 hdBq)@C)^ϋxם՚Ǚ\w߭nGSY#LVN@/o<[?.ŀZnpe׻Y"پD;m]5[v@N#r7۝A@bkQ)GkOoC51sv5zpۓrĚ'u“6NxG (y{'ecF^n9g Bl3R(KC~2 vԗꘁTp++1PLVR}a/iJzbVQB`vF:;ʭ@P mJE0CO:qV7Jɂ󔩼̽Xe<;;SnӃGz'+H%SXxIHW:dN=};-B_;zI.3an~'78wCnD\V|NmV*r*8'!!"`C>N U(g, L2NEҐrSE,H`r:r7T|U<q,2ɧh*5M#‡h,@ZtH%q?@cμ*6<:O8]eI8Gr@&6MȋidU/<-Uyfg}1c3:У{g;Ryy>B 3틄-8:4`/0r["@n/i``Z7㚴>WHiL]"؈]d>s=nսk"ҚΒy?!BT]$yr[(ݤX+,LA; =%{QyGL2&j:m`!}1H+5~(տrN>< " =ݘH>TϘ2`,ҍ$ C[i PrFýkfixh1ˏ"uH?d4>[Džt #j'ȡih%Pa+hճ ѦW4h}DM:ޘϪ=a j+i^m6iTe'ǿ͈ogrnYPK(44Xbخ8O&MSʾ%ASz=S)_?/葤D2FS'i ̈́T/PJ`i>:X*3%Eu\yʋ"zNR.l)Dy$+ly)RH:UEF͘gnk"]}=x8G4U *`.yf]TH-&JBI#A!M&N2xK~˴[h2Q@Ӣz[(I4mrf> %6}/* #&#W׀Ft D}iki[ Ä2L~_;7$h!#&e ~8ԝGCi@ {&m3MErX,sd!nr^nE}{B P0)<~/aɄ[kI_a8mPzz4seB/˿:!`IU.OƖ)?kT.ڌM XT;$FoДT i2B@*148ߐv = @NtҖd/J`dguh ؕ;Y4s<Q h4egLKŲ_AhYs:ᒦiHMwKԊٸp5eur֠4c}bk[CqrAd3_~C9Q ΍'(t5Tbǀ 29(]uPTreHI/Z&+ ׇ#6o.Vft-7b1T,) ~t=h%/!suHS .D}*ʵ,ү@ U5ᜒ Ū*%lF5J~XgKE:'뇪z*=4F=z݀zϮNatUA ~+tcH}Po16ZuEZd=5cCT#l1uh sҧ=gҘ>39pbl:wgA+ рcth9oaZ^t\tdfGPhرa2aA ?L/prdbk }8'ap`{0-O?ϑדPSf3i6|9Q$E*ТQRXKSL"[[tHZ56d ԁeGQ 4c& _R֠4)SH ZWnc!P/t*3i&rlGZo8SkKA_^=,8Yә5/gUuG#lb,5|XP3g'&wPnsuZHڽE/ImNv4=^f{_kdmC+r fjK)zS1=O\yc);뚙3ubQ,x[Lz LyE2$ɤi]$&`HZ4cW'. /$ApClg_]jfQmFMaOnW'_ZGӢ?cTkH)n++UВɦD HF\HS[0[iubw(tK>nFF`d:vAHa :QQv+RA{kxz:uTy:Uπᑶ, Oá^c$b&usI6' S0K6Ӻc΢Bט޳rvWOQԹdi^m|I9L.5_/0Q] OqHv-c!ʏ+&%! 8#XI1.POCu_lG좤W(`AeT?5U:[CQ)MT @o@zL:%S'ۘHTRYLt8dn80Ƣ_j,L?]Bk*׎jMi.:VE(Ɇڸ@\/b$T^m3a܅%kXh2xSՂ;^[08$Ɏ;-+hRqsL3*L)f) vY{gI`*@8HfԞJ =QlcKkJ& oaɿoJa* m"ڗJr9i&GmSd  fLh8SU<4X R\BGk&]> F16`߬hq74͔f#h&VҔ7J*oCKZlŴ0mdڵ@:Q_>_d<*)پm+ ϥ[V, u}RbycZ5`( .%Ib,ʷ ȭJbfF0,944V6 K =Q8#ISDm8VвU /r@ Dq/7'==]cnǘKD=_8㔊 U IDAT b )M+,l _|_|I;^[ޭ~W!S&4vy5;0ۀ"mcäa+]-}(RD?]Or[r/& nHDTwiVh IL6VHԮ#iߔ/`TJoƮ; ːWyxP(D5U.@jUZob ];:s[TZ5{/ueTXNXU#3;  `DI_CBz*d".L* b]}U J#[I:mJD[Y>ؚ}A8<)(Jzpι}ŗY,ZnMvvNrUmo^kVҤ0qSh.Oe'O D'~S|ˆF4^n׶3$ w\(N#&,H32u"ͮ9xUݶׄ3pÞ^l^a^XLNm'To8R3`r_|ŗC]mBF(DVmMB,z{8Y =vm*P-'*Zel߶:usL]_]Ӈ} %F,vBj?0}}Rt:T${&)c L˼$Z X`A"j1_ؖqp)0j.wB`ב]p OI.Wsx/R`V5.]=7EHJin-$I۶lXt(.Ulɤ.Bi㹬i*<&{UJHpbN =/DA=nI,r,`/&7)l&PxN"Pi ;`i{Pp:'mXNSN-ڲd=@}_SդTQkXӴj4M3\ӵ''*%%F.AIen`f"?KG*$CEǂ}Si;N`u~&Gip`N#CDrS< ;1̿s({qW&%ؤ6a߆LBI%Òtx#e|{\Q,i+ZToݎ}@~ÉO~, !w,xJo &S!a!۱J-u __7i ΎK.EީY,lVX(0]j=oN[ xZ]vحzJJ ZNn("Eg>^e}M reQF!@a?c`ҨPA&3^ Vg!X L$y{YZJ\I=TE:z$9_fo[ [a.~#'*ã* \i7!|R/%>MgۣR׍,xɣ ƧC&l$e/i}<p{C|IMa\Y/R:b3YP+7"$IX.E´ؤ0'?45;0}܅yHSﻐ.㉢"id'm7 P(^ٳ9cs[X8mFOEFHw-%QLXAց}q _W1M@-\rpU4wTQXl%'.dV9{ӞK7B[ßUzG{#< PH+MI)h?{^/^S-ʤAa4"ĂY9!jW"q1%һ%$^xe)%!5#<SoB v) UL}u٥ɑ8P&DmϬNd*~h_85ˆ |\~N輆6k<#>K6SDuZK.椖U#weV-5"T+3У_׽tKGAkH~~.B40}dw6UǪSq2BϠnV_ZTS)Lx|cѸ-=O+ښ-o_s|]WJke y.=&0)G0`Gn?5{1>}.šeٳ)+hq/cXtVwi:^1 D RL LhH!7m/w[!"xnkCȈi%/ų^+cWrQy$yF4Sn[?f- uiy .$@x+ʫk{q#1'D͂oSBM3];nk2kР{%]7![7 o{{:c3Ùlk@&y]Ov{凟YnZf}v^4j 8a̺+יI yrErlaNԧw7߼4e-{ ˸VT-]!胧$W~}}Eku֎?ab v9~t,]'~&^{=Ә*,`Kt]._/L<|ۡ23+X3L r׏M&8#?Vnʅw s`UWbKB[7/?|~ſG|!9ooݩNdKzNE纊;ՆݫGU0"&GUGצff L?CVOqE&z(^;TƸ?a{ڻA@j 9vUع// j#<4zr%wfKQ>]tOj&X-E͗ K]5j XʜtViu3<.yƮT@F{ 4Shp&{^ȠoK,}|J_]=L=ESrOg݂Elu_՞v>cPLT?FOo^*35M رcV;<_>xڡW>zm)eɾAy.7\Д?ሧ<~MWڜso6NwdȗzQ' 0-ٽj>vpͧмJ 睱O|zL]`;CK; @2`[8[MGp +G?}#{l6[,Ktf!4~DؽicF=+CV+G6x?.aπ. }sf2aN2ch#zU2(aOtMŦ+@@\#sKqr JBzlLI2gIA΄tE yMەD6K)tӒSi!ZZ2WzYRY,jO'{MdA^M5 ?X*k\@A+^5hֵ;]й ݚ | >}2K_ XV\ѵv},Q 22MZp鰛9~eL#kIV';S BۚivtPA .f5#i 1w,vdh@@xSÜ`Ondd ȴ dQ\֥:t܈;f'K9vT!DntAMyEn݀ƃ;92̏;GR;:HjyTlZPo4f~0uQh>}ZsZG[Qmӭ<׬9 3"hwqW[hx\מrT%k@vg.};נYnt BvYqҾJ^-NTShdZu\ܽ:6?رK8mӵSuiYOƌвaY=FN`ލF;[j&MJ^)[>v:{^İkN&/Ўz2cjZn43}z㐨u;gq߱tW:Q\"Hfv׶oْtC@׎4 m|Ȕ!89gp*36Ͻ '8>;N:G+{|4u9u 'hQ݁ Z=PCUF9f;o.zz_La:zнkޥ7>G-ℛZqQXݫJ>R=xBDu%tiHhVgP\hd eq imϬuԩ!HNwggIu)]5{VBlӠYUl*HaP{-)uU.f+[l?̐.M;}b#D_=^iڕyW[]J^ 7SګU`wK5tн"y$ Bzǂ>mrĀ$GjhGuNQAuػ ՠ^UXcn 0%^%C;fm](|h.|.L˪ͻ geCA2?ZΝr7#x}H?~w?el/ Ue5 kPyJhuDA%ATM0gJ k ˿ 'GP[xэ6dx'infz3-_fg#_5Ųη0l\0.5:t^|Е<3oC 'eSn8'bU{yrBhZ?};50RӬ.1hZPղ*ݰYل>hӫ Z]a ZEZz7L[miطyc`¢td Φ]u=AX"EԤF4-qU_Jת6bFMDb- !nRD̦ +&PPA81ۜhR'uEcFmkӼ}4<3y-i[Y*"BpFsp>36wG8 bAȀCHV* B{nSG6֯5c-u`=ijXjfAutG|ݤގK$A##())2u#Mh):[cNAS&YLAJ&bvkt< аe¯<̶=Ԟ;Ёn>% ΢azq6vW;²iٓ~ T_FgqӐ@A/dj~]QIsjJٴx e{sɽh۬ͩwo)/͒ނwx U,-N?]Zд- *Pnkd5Qȸ.ӚW(s¥֝zyOߣC9+2:^ɰ(kAj6oA {ϵ}+yE-B.O!@>}nSyχmcCgѰm=غ OkT aKڶkGvhצ:G|sRWϟFҡA&P̊q#9.c POY4-1GG@{8Q=S6g.ڍ:/X5E,N͈iԑ)ݱ{Wj& hHQ>#5m4~ݎS%t5Jk=60ן3xL65iV~t Mjv QQژcjrblgCN JO擟/l@P W̸בW hg IDAT,قU{3()}[=\`j΄@N.j`l;7 s=]&)!mN^KX > Yu8~v~f+-ݚACūȋ҇VuBVj͑GW?<s;򂔬nMCո_qs}nFj/O6mϻfg'qT<پv)Kwss)oۯ.љtN{ϞgHGƍ_Nf09.%2L8&u'zoQ}k?{oܖA/ hqK{;=Zژx0Y߄"}ZQgѣ}#YĵB]0@J "^($d;L)gcM,>iּ,s.R-]HлljTL"l-,1s&lLs5PI\w ^&OLzݹQ4(z7ĈFGfR n\:US7k|n[]s'Xn &`v_)o5wpF5Ff5=!%y P@,2`+2= G}=ύMcZ&9 EӨ;g}CGz:nZ#>~FRe!vʻ#QG[zp,QͻF3)2_u.Axk~>F1ј'^͍gp;.eX' T!Uλ|Nmy˲UI<q?wf'_V8Vh { pVp [wG}O}JZ[P3Esn?nWQWOBFG_ԓ*l{w#?GAt>&<;5|86?ˎÒ0Xۈ+XQW {֟ixyJB@I8gwxWyȜ\/.h?#mn R(Lh/ssƉ 6f=-Ef3woƾUkƎ: rYF3vu">1p\:b`XѴVN4<ϻ:/Zu~thH*PDT1!ג3B_,<]M`ciAO t:PUe/{-Aln-+@ݭ.KIZJ-ZZO9又.#iQW &5D|;5$aF㍕X4W "ǘ{k|w&kۘ- ^s.Z7[ʉ>ƹMb oɰg'D|+4ca|"S7?ņ!$%/9!D\\bdHHMjG'2\_;uos+axz֨;\MTB qc8~ Og838"@H  (D <Dt D3.r_a# 4zxS HSiK( &ӹU mXTס)U%Y&l覰:+NTQp]Tv;&/m]|HT.c9Fz\)f"M8W}CH=р`cѠ ?*R)$Vmmc^Ck _ZZKMUdEYx8Si%F[JT .XCRHH2wJVrM }qRAؐWo&[C5ynpdɻH%C^p8`ݏʨW$f=Ԟ;Hr͖jSZڤ;Ubݪ7b{at~G3^B]W8 ڡG8 q +Q6L2=u Iyи/[&~ GKvvhZF>cAvi0u1GFw@HʈKǾT=~sPS}"FuʨwM&$I^eudnY 5.ɝ<9Z:']Jp~'P0xAٵ'w?B6R}GD/ ߸ ̣בGSZVF<`UHpȇ0Cq&^+ ?o6M ;N﵊(X,}rUn?2cjjU.ǧ/DH۽g1Δ&J*_|`-[1)L:v;PNnDoz KIE~)پm+ ϥ[`ϐڻ5yp„ Or(S=y~-%|i[QD9ZWaG" wv39e M_E0ἪYN %1вbX-Ejb#L`VU9v IIfx'1hi6Ѣb+C_|p@0H}R~q  *6kNRQ0b{#ꥧ>%W9Y_Ț mp~BGSkdRet>ͮjfN22oHi QoV+}`4,jU5 k}R5FPzcB|_60e6l 2}n7˭zUF:G *<٨)C^tRsK5RHsڜIj*T U5XUDҴpclTj9x# V:H95*C*4HX!iC[ W{_|ŗrYzaQ+I JuDeJdnUI"`DĤNUvЮⱗԞzH/ V0 af={'+%zNNᘶ"/T-\*K1Oct9z+$:/.\J8PX*CYzZzv3HnP̌73$Py!zjya(|(kKIN%AjukVM;k^L8~n;.m/ .ŧ#x(itC}DT(pBCL)aD.==L-ؤšCICY/7~Q-ao0) ov ӎ؁`7BrP=\d#1TT9 iն8{w=ɵ"l·o~ws7PAaA\xt`ǸG9qP’nR/囇1xR<3ɿg۾0V>} (b[;.xo||'@vî *R ,f m-%PUNQ̚Maَ0d֢ՠz^ XCH͋1u_|E`[[*5*]`]I"SL4S+MA! @b91*dc""3d/ ˭$JJZ6d  Cv肈YBzE~*뀗*Hsrj\ 5BmHV*mθ^=/rq# /yf:nL9}>[)Ù|g6(E`BVmY=9ѐ_Y8w-WqW:{%F~kgQ%̴vK܇Ur~P&e[5v8cNnG59U|gj9zc ǬlW<BލĖ\B@_| Vv!i&<>`^#B'̙~P"h,?f! (l1^zy3~744"N.<*r4O(V3IKv}`ΑczemUm6+Ыyc4_*I]HLMtPEv:67b{YWv~?᪇`@ЅK3S{vl}jk1nkr?kWa_ِٚ p[Mwv#1ߘZ60n}8&"XvGӆW1Ә;>v:{^İkN&/Ўz2cB-&NЮEuim-<_/ P\*Lhp5Z,pOPh75*dq*DQ8\ie0:T E'niZ xeiW陓H1kCb9NJsx4`-,=Tj-C,)LKE;}SksV0]4Ns߱TEv}C(aWW z&JBtUҥ?XwϬ7!`ϫ){X2}5V}iUUU)u Jܷo^7w\%l2 YoKJ O/%S{[(5˟+@Oش#mϑ?Mo'[ƪh2;a3Ӎ rW@55A CT"o էH]L1UW~7'\(c@4\&f H7bZ.l8Y*ZTrdx/Gs +ăRJ)4p8If*i2MEI$,et;,6MuGdРgOrNaښtq]ϢO|2r:kwtb2IRn!hhv_eoM8UPyY3tst?o>̿eK|_7 6)!HH"IQ8d[@Q )@HM2 7a40w;^4zWYq0jOMh%uR|HOۼUFw밺丝UENhj0+t6LH{oz=sc& JߖfЪ0v<`: aPhQ-<~1Yqla36=,=fUA*>B] Y'H2{st|(Gۡ{goYN52ňxC6GV! ہ4oшΙyχmcS/E^ݏ m8f/"OixI)/zKW"jtv!AK-N}hNvCo-E AX?{'Uu3[]]XXvIQDņ؍]ILQM4QbDEE&Ezum3sݽs)K;ݙ[={=oi4Oee3 k7oMPܒKic?NGCֳNdN Q(FɍϤK|Ͻ A.-x35CnFmK~u8koGYv-hza*;!O˲{!؉,ApjAbQNM+`&t#$3b_.u@^ndIߎxH[bW LZS&K]<OLñI"-q<۲F ҥI|1W,u&-!=/m*u^o=ft]x=Os6@+ч =grV¸ҭ '\ԋLz>l }h?/ű-n \/OØn"Adp!YJ&Cr[* ܤ"fAu)Db`g^Hp\XU !]mΗhKd/iJ,X7e)>wsYjrWc.Lzÿyq*(((($o?%F@h6Lh@wXIĭ L]&5o;:ou*$ n?IDF#DT$4/7j/$SYpv&T J$(((((((NVʫ]`4DXTFIH˵ƇBHo+Nb)ۧ{D&nSMGDÃbI ӡI6Gm+kVE vWWPPPPPPPH'D=G<'OegɿUB?C -C4'&\ϕnūͷ(&)PzY"gC#X˫3g_+$jE-aCd/G>Zg4NфQ`cRZwXg^t dn&@PPPPP8X".CK<ec윛>XJ+jJ1 яZ IDATu"R}z|X܏/phX.⢸%Wq튃p;+g/#ՈQ~9t6l2iA.a ]Lx0m_HB6U: ؃Nvld8x  n-#҂Ɠ|a_sûz)3'n6ڳ#O4:B) [Z'l+!S\6!P X$-lMz%,D.Q8 w6kœ(@Dgo!PVz]9=0Kj7NPPP8bM^^>%iM_8JX%L3b |b3"EPD-3m?F'헮I )}!AZ2,D.MG\$]&)R|\~4k:Yxy粩FPPy,\{SZFyw6w5B[և.kGUcu鑭5gsσ3״Qx3. 螭Uؖ,Zi!퓳QGˣCOy)ڕn]^okr?mXngۿ <Ѵ Y̿'>NyFh },{qSwrR!.իh+"AVI7F/Ľ}D wL==ϺЕ`"^I[v.7O7?OOG :a`Veeغy#-[BK!H$u27+gΟ^ m L9/ѕlEOq"8}ir`Oin*R g+((nfS nb3qOu_/Wď*7Xa4ˋ?I$P:;O.jCZTJenjt_Yrcg]ȯGx |9 ^7hrBN6zcGGQ-ۺoe5ԑE[0nSgjTo')#zVqW/~)rctbso y"#rrr/`Ϟ]_:=.%~Ivf*Ht16qW&ȿpKnFm R7tkM6In-pA9M.CZ<*IZԯe(8Wpz_n7̪Ռ^t$sS;VX)+Ƕ6U`ɷ0@4+_)){S'!OPano =|c5={;?CW{9w3 nݕ>}:(S*?\eA֯Sr/v#u6p9cx2-<kd}gx|NV_{/rl{,ڰa XBc5Xڽa%9;?J_5>=Wn,AB⇋^ŽrLuwˤ1dETv-2l>G'-q̀i}pz!GdrIZx.n%A;lѢE IHO.vEo^$l?քh&ouǭ@HGZcv&/~?w1McưdV{٩TUPP8LQU -VgK5yc6gTv"Y:3ÿ́cݳ_c⎮\vpJ9Oopv|U"?o.׳,r]؃<\ڴce رvD_ɸggwM^8" D:=[DS;[4M6EA%z5]F .%wII;L 2 wVEQ i>&Nȡnf"Dn@7/ŜxO9zE5ytm;s-wfpLF&i<WO uK(9^/ߙ|;J4Zs  sc/:pX]*e~$G ]O)s63(~}F֭'dKq-UE$ң4]{^=Ƴ=yt.5Kˮ?=m> y~0kOW/98Zn|0*aHg:;Ktzõ[iR4{2Hi&4}iN2Bh IΐBx͇*>J@Xr:H:.T:ʠs-'y8_ vO }پe3?MD{o0e5{!l*F_ƐwЩtwһ{S]Й3 RW3gCݧy,<F]L$C-ywi F/f>~c?Yg`/+aw/pq\nyxnE ?_Ɗ'aŐ͵;У=H3?) FjwߊG_lRĀ]HOf 6.x="`kĈնNWx|]u6Ikw#ANQkoΊvbG!<', ޿lo9o4U"?j)f@ف O5+y};w` y)s=s­=ȸS*ɗk|<66j ^N 1@KzR 05-83(LAТE dH}^ n5oa2=v)y37;oX /r>5gawp{]+ZWI t8:lOV2Z8F&? jwǚK S{`񓷑;Ґ?WkƟkk)^/^Z~9=@^/8w`R5Ξ.GeY2UW?kY#v]Yh_ђ2}w] e0hI5M^Y+wNYnh[OL|j {үp,N[;2NW'[=4_ =1vTLdи[-ؐ u}&{]"72m$(pqrs@6YUȄHvTSPh^,|_=֝32~q ,6{~‚@Т]oF[&_"r\{#?c@MU(~,1;c) @$TKAaiY,ӇWSn7*?ڲ.dmǶQàC7TȗƯJ g>krhg4? zt hS,{Vvthmi1n1+>9ݸo?ȏ^ϡèkD1*#@EFdɬ֎Gv8@Lqrzl*$RFh+A#S|^tT5n-F[E19Z&EzZ%WbAoNJ4|JɆRDSDI$щ~Oqҙ+lFuA@ݒ'垵\{9J'^>_M,# IHP]Ubƴ?@kj~y䣟 iM4;pZ)k q;&n@F-i*&zE!#Vn–FFFİ}|y"Iz<;KS:A 7Pzl0G !*(n[,F)e7t<(813I:Xl^Lyɿ@iHzP)iu֓1hˑR in1ƍ~ dn~qҢM!ty'?;Zlr̉$S+,:\r4G⑹<)h(ɤp ; wY p, 79SbSLULWY T4Mh@L/͐L[BҜ9pDGE$|fcY*E+8a .Ī~NmMPKv879 *VU D(2 e I p)Vt$dq%,j;&bKL >+P0Y%t酯H-.؊IpIҎ_Cc~a×E L6} fn9OZ n? Zq-!U@t ^*X滩N/ eWPPPP@f>4;30Ϲg4CdjRu^wJl`uNT!J a"S+V冥P~J$$IPf/mV8} 5IYXqXphmq^o9/!hfn)((((Y99?'mʔ"a{z#~auGejnuұn?"c}ܑ#RoL&Y/mGZDHϤyCJ a&o'l"㾎ǐ8Z&r&4-Y=d'Hv~$\V[SLXC٦ r]ݡ4 >CX}*\d;]o!aHIiK%M/[f%Wۈqm%!ͥ%Gx9\Pd9]|R>#Ct{(((((4¢B<>ȭSd^c=-\//|]#N£eZHgD E2!C ҝ#]ٱZ(S4w H + š]}Ҥu`P=H8c$)5J-间zfȿEL/+R'@ˣZ$_82uA]y-%,Fc;blc}ƒZ8jVI Vd|"8?3h_Qu)uN(+I r{V?h W><.B_Ed:D@Zp` VbLHB37nVJڥ; df{.ۭFHIx)v;"['Ny45vfJ`_^ Fn7i_z&WRIkOt2&4ևטbYnw.䗖 xYr+r>~H/t6+(((((ʤsρҎɥXk&yﳴlGaS YLHXK*f؅ ub[ ˃ <(LҙUX;m>[^"q0-mt^ }܄&^|_ 0œ+hFg5|F6~yapХNDjt2FVQ2hv;NֻDBp!Ȧ4@. I{!Bp҂9Uu3ʅSX쬜ᡯ2A\ؐA 4ںn?-ґ3S.ICA9Z+@7QK%wt7 kvү}7:c80x96ca!ZwPx3a!\SA}̯7-AAAAAAHÌCP +o\D=.EL!||P,:#uuG>nje7#!SnHn"!'QvGAAAApG'ML2^Wڭny&/T|R¾u c2,TŮR5BsN0"-GIv֗҂K$;Y__ &ӂ$~^6HΤ(/bVEZw_R7T/7OcC#WXF *3͵ʛ\PB6rO%2v~JB0 pz7}ݯKFntG`hdvyZs,XgG x .>=yfN3 u5 )JsNӒX̅vZs~0-A:ytl^˔{7oDV.bh(,. pX U;`\"v +[Q`Oi^CJ~vGϪiZ#r&d&T#9┓O=|#s|_p(% (GQ97ј + \dpж^Z#x 9mCuI IDATBGuΟF{&V_0@Zcτ\SU(-ב Hm>N{ʰOXi"# 2g,KkgRI)kxu"UvGNe?Lb^8motJKS)+eX|"1jb/D崘 mt~a;!Rż}H$Bu}wmX܎=iu=dc捔u̕N#O t7;[u‘;c3b]v@GݐAA^޼V d!iSm3&Z\/aBi8o5kR:xaMIQ`֔:k ZyII:u}*}/KK7!a%A ЧP@Z>z{ÿ9=l uUG*2 wDI]6&+qmI bU5uCq/D@'5#Dsw~vc/ukM DMzrϐIC~Irժ)Zq[pz2=IKS_" ٷ~% #r>es-[ovȖմ=[ºs8G?i6bTE9i3fK}zȎ՛YhCˣktCumd~ý/}oQx7[Hl.E󖰱B+%q+vn,mx7a"fVVsyOKIo`QITTɻpR<Nj4>;k cҲӪ&);YZqFM#"k牼^Cyؼӿs;qѺM'[Z Z^)z@=_1ُ)/\8gمiC0}~%KW;Y9L{y ;+/EmҦ$? I3HT">;҉kF#&>Ez>_ehGěNW^ySK52+;t) KFp>=QCGYW=K~!?ޞ+ڭ=>t|oX]E+/^ 3$[O0?NYP/'g5ii #:)Ɋ-Y8`${ ,Eh 'ɄY+`r|\3?V=y&\xIt@=s^Y+!PHgp阡P_ǬUhoKy_Á-oƫ d5gLiY7 )h]I-Ғ~sNeŞz C9s84Ǣ*/ox:.nY;^/bo|+WڱoO; ?s?E ®oGټs?!@T2!mn`oHТ8&|(4{wS4>_Mdmfw:g!Uw\V7dܭTG@ N=hУ|z~y}obsԆg`((4a)mc=ݬilATM *c洨<ʆ2Cl"T2~i KDtb"{ecAKqdD4g#\42n?ja ^_E唈Yb>;ܒqw9C6A>θs- 6B?>' We}\ͱmnsgSϩS5u^^nv$ƸQǝ ;yVqC8)ר8bN~F[,z#rE\L):r,o6g5Wv"&kmKQОsoGIȪE+,*fMzSÏn;9:՛Vn;ξfrjx&L|ଫFSȌ>`k( xko+2 K']|Ͼ>muQD%( m5%;EnAYmߣ-uv|]-Tl<excEɅȿpye_^δ AsA6 cF1`cffM?Ha vs vfN [e'2FgD0 4E,[L$HH)ҳލJ8XŎu09]a$ QȄ{eA0+D"Q =j_|Kɥgc}e+V]HEG$,ͼ=ePFF _Ҏv9MصӘ2ȀeL\fGk~Eؖ-ً݇>19 ڽKګ+ZEt| }JУ3ۖ \ߛ9}8mlNm -7QwzF+AQ~ޢ鐖bZPѻ7=JУ+-/y+&Z]?2?{*잔J5aTR\5œa{x}g-gٹPBtJsY4o v~;qJ\qsVUqȿ]Rai6hVUvK\^KjV:Iݵ:ϼ>n+alym0JPx7U 4Y[[l$e"Ia%@xߍ^Ei_Ɖ 6PHXI0 n\H=nM0$ >z5vl0HNO xyl 8đt/mAdF u*QTs"}G^{7{t/.}+c,`#䳏'܌)G\{|塴"[?R?|.әVY|3Y&d<#h4/&>3/sСHgx{=xN%*tVGVsJSp- | y k2g{VE}erK:+)`?c4PcCMJJo;JV\;c DkdX/跴U^B\C2W&q/36 S|R/x9 5:#"3$nzkCo@G"DvmEsEߢ}o^؏y!2nUa}D9 s.MaE 5Mlr;Fw`mF54,N.b'!}hJіg O +:PQY-+(X|^Y*O9a:P^^Av-<ؿiBx/)Z ;z߰:@.%IøYPwa((oO>[X<صf ᢁq:WӾC%ىf ]7eXkY?0YrhT}8^)eOjhW47ތn-Nt;uӉ?I7koع{-D@XFhlI w-h206e11<>[nUk4%ޞca]sYm(~0$ocL9hZ[ck ƻ25m>*vɬÃ8ҳUWPr껷} W]8-ก3YW4¡!ggLUQ޽3ZBNVϚ: 8G م!* "̞!s}hQ9ɜ+~E&95]TWpׯf?qa_0hX; yx vN!8a( ֱ@J{!<ɋ;as8KVT[/E2* `'S m4ob7В^ޤwy}Έ.- VfOɲݺ '̢hp1Ք DŰ3ˌ{mg 4/&|̮|ORukofד)t9:1gq;3;{}F0mьԭY 5Qb:%Y%cmt* (̨S[h\ڳ Ւn i&A+ H?V'|>ke;tQx҅ kZ؈h̯6ug"e1s(z^oa< ^j K.;ce p#梑&~l~`-" Eij#dxI=F~9"\C /]JmE] 2;QI>-0쭏>N=uչ-Dμ|ޜ̀2\қehg[I8@a1|F5> e%GrEg#!ې΁-˙9vdSe8_4@pe'qU1e}%"/"ȣw:UmO H8Uv'ι\ޞƛOψhUً@F^dȦ+ǴΎ\~F^6>em[.g;S,E>MB$/ڭ"ߺ/g"E>#b@*@{1m|--]ُ~C.mo2ybb.ѳ8 *FqΠu:nݛ&Ooq"ЊƱL| j{@/_TD(vpt%F83XK`w|+oq;z:O/d:MD\yLZu.BwA!Dzcsmx*}²^9 ߉{,qOڊDˆu"RGjG{ul^/W{ŕsQ޽79aĐ336ꗿȽOng -N3A?4] 'u&p٪Xi:4"@ MDk߅4!<1ۆoA6n,,VcE gp.i!ά N@7$M1:6HD&4utobCvL*Lx* l3s*ͥ]^u ++VŖ 0 "?r"DZв͑av.r6Z `, wk'ӈg*csSHܻV|JAr2F ߔiޱu b^(W}iJcI2R]@L&\яK/.G@82D0hd*7}f^MOiss+H" @G?V̓i?^UBvHq֑E޾{k 蓬ZiCq^@=~C{ذf5R#m |r @AV,#+1 fZbh 4[fi+6E&а`Ҋ4|v:ٰ?~\h4 ]A+ˮ$ W_DV6qgC\%4m T((x ެ"FѓuV 8RLDj[1d( -! ߮)RxN د|ZSEiu5|Ew{ NNǕGPy-((󒳛L$ ~%ij[H!fK8ü{([+ǟTxx\o{"i aO.͟{sd(7NJ|>3Tăߓi 6Wa a҅${JM蟲9SD֚u/ղDxɓ$-Ķ4ˏr1mܧwx?6f"vFGƖBf*$mNWk{YbWS|YBqy酰'Q|&lۉt!Ld N1Nmd[F-I064E2MsFNRf1u~YȯUY(,s(t9w.Fz2"ޘR]<6D|"FoGV eYL^\RY5*^NA֩XF2KFPPPPPH +5Ma+ҋ,dN$SJt#oI"ZêXk)"#HZo r"^wC0g5J~U̅jձ.`;^U_6+8*@AAAA!5B%<} a3ɺ$]`uH aDM?$Z%Z}ĕTHy_'RhGSiyHH_KĎqE$U`'Ģ/sQˠ vsHޕ5g4c:JJחĔ-Se}">=E՚ODNQz%f e$z /+ ^̄ovYJ=L֭ĒS{}j6%-F=)\XL˿R#f"+^Z![wPVDK84@x]VrI MA!ĐH azb HieːVPy YMğê 1צE/o҄u݀T 'mdQ488L ۦo^'!<6M:a=bf~cP~ .pnukv ?MDy?\WPPPP8!q?St4߉? O4-Sl%]x;!u+ED%'w8!*}ԳBzj5I XZ:[!$@q"L"P5+:iYz k}>g/gw8LݏW?KoS;f+oCl:[K>q-cç>aZQGm5 xX~ ǟUWE"-ͻ~M %=N[^n- +>aƪDJIR 7y\hQɱ^w՗XW5<"go`̥m e!VP0e/V_^LثvK:N㧌8Yr?~8MǍCxu6'sӹCh*.UOb3hHsЄfC|%Rn/"%\fPKWX[ddQ_H fn{CM" ?)zC c}w?6.a>IKvq{/[ۯm*:9t]ϰ`~.,Fwhil[šł,ߟOcɪ% 7=:aګ_r螝,}s fyӯeK;33tO8,F~NH֞e|:nmWDv/cz\w;'gQi^?{M*]ʤgiHޥ({L\z"[=8?(Zܯ6>yfegξcėyל_/xtXڱES`u_{ ν QBy>/q] ȡrPgxGNA Ķū-O6S6![Ost:=|5t:HP[Br>w)e"%%$D#f G:_I,#< ),șq^mf-m.p3c&_Ix¦!(KACbFahQB [&3E =]o?0@v0kZv|^Ӌwj@Usׯ&0vbh7gb᫭d=_\.-=cJ{ aЀB陷yWҽSEa6aDKD}ӋkW3Y5ıy{/8j؄؇6[T(ˠ! lc2?Np" ްm7ɜ)t;m//Y Xݭˋ9O7s~,] 6ofoӽG㽪[o,2ǵC 1[୷qƏ/gϏ#Wr.w}>nᎫFR=Zp+5U'"o{LZ_?+G39SF= q5 2m,\\EAA XXU-Jך*hIkF r&|Njr~b{ض0a=~e s<@^l$-o'>"acXM\H '6.ܖ&uSpi\7n"m7*7ҠHތNGsYLlz BVMNv gmԏ̐ae6eSbی֟ujϲ/z/9m:Q̒KPVmhIv* Zֽd#v %8]4>Yd;aȍ3x||3kC%%NBy"]}lgxӹV'jrҁa B]9Gz~lvgҽfoe&I_f+Bkײ wS 7IKuJ`w! ZD.@`F@nZ?mMAMq,Oƻd5)LB3hF}qw$lȳA/I~ &KܯPDN2NjXN9H&*q>(dxbQK~M:n`NaY:o}{2c5y.ad l3+$ݿӛB0A4tdU~gv`̍w0c!uxyK5)Ze*^}qwn݊;>ذїW}wf`pAyyEJLES`ZquUWZ6UەITmjqEQ2b@~9|5r{=g? 0N+~_ s}x90QNg_ǿ$%oǮ1jt֛ŽlOÖ~w?|N.<\g@lllOL`?S؊]8&λ1 |86KDHɭLW Y.e?\$8,y|V,x:7XYzh]S)B؟*cQLO[xm>-+Qª*lc||Cʓp: { |.c_=G8] `Ӟqѱ&sI8Km wr*.;k'L~ߺ l9J\3oZy7<E~_ w1?m0WEgdzO:ݘ)}zZ#l<{/Awq=S8}XX' `cfx>|gpOQH w t,N=8xwQ2q&a_xl֛mw tů>Ӏӏ=MrLwر{7š>Ŗ8m8[pCGydܫ[:TBO" +Zi°4aFYы`qx>?~ihK\02VuO?wl*YJ S`Qk'Lm XA#c77Y"3YڤvĚ}'A9==|)|۸Oo;/?;w[>;]x{8_>7x{G1~n|>vOw9+}LJv|UWgv7>u=8T>~2.؄=];{^} s<\x pӛomӱkO> .Gep_ux9.ڻuԟyld6࿗XL?u~r-i?#rJ3HFJ,Q]$R{y ;H=GʼnG*#e(7wOLؠ޾JaX܋ x 8lvû`;޶'q ^KOQkM;ǯk݈9pҳ"Q[ ?M=lǹW=|>>Eض8iT3_}Ѹ#z 0:X 1y3=r#sO݊g l:G;FӉȋ^:A\g[o16'M+pޅ۟y'_OfͶk9o kw^/7oƭOs߅7 .?aMvS>x#>oG'6mY='mƹG_x>g@zܹ#Gx7^an] ؂{>k:/`7>R<73_ #D?Wk1ȧp{d.ykpEGcLmGz4pJۅMcLbL biEcs{;omm_ފV<}kjz[omiA /j?ۊ@e@+A4(4Qo4=O* >/tȃ,~Eu4nkSJR`~&BS3D` 1=ǿw_NO> ?WVmܾ/2a2~#(6S"GoIȇc M@Zu}{9gy?\-@Xc aGǗjQ7 hRQxR뮴z[o=n7v2K_PR~ P`TLi? !Jr5`*ba(ެ$ޤ3 !4Wr)Ԍ Lf]C iqK>_[]5Jϕd̦!nUmP7s ʄF6'sO3SY-K3hS@p~8Z#ܯOTmzy/̕2%l: L0'@j"<󄛿mEf4gPcq x[{t@׎;f͔?wtڱZHJC@rKq+^C.=5ɻE)Yjƅ3"G`!|gr^Ϥoc6t\6r\OQp7*@m](P`hV L T5J ʬPs5YuNzsL`2'V0KY}d`2/J{Jfc#*7Q ;zUӬPE~X)٧c4G~HbwIN+𤍞_KÛMlGL& v3\& 23Fзi@}~FK9-N1KRjsT#FfQؼfkt'')5,UϢֹ ͧ,"Q_ؑ&xTR"`hWDzigQNu!&0HX%qP>tśX1`ߦaHUH.OdI SFX14TƜJ6mTł7JPHgKi$!6!kr%`L2@11SO}^d5+嚑gHbbeJ?"3˄`TB|QS&,_C'_3$}d-w6pxfA90sV8Lm~H!}O H@Q@ߵ*%H͢@P~"zu,νC*rעCBV ##'Z@^>u/'xkcMlI'JI2ĒO* 9j`4:LR32~_ Nv$0qBK𯱴qRŴQNs ϻ&3d)WBE݌Ux*䓌si y&W DD, JDs.r!͘S QŒsm͕?:QNP pC0 p l'@ M7nq-j~_4'@=b{^2S' sV{sgĩTxnS*uIdt!N4qM7P:A̝(YJN86r=lp+䲷YFr ՜//Je@J%)\ѭ(Clz#5V)CGΔe {їs,L"]n0 řM SY0k4zFV5GpX:EҔ]=0\bԸJ@QꫜZ%u~^WlEH v"{ FǔEꃻl&Xk.'M9d˭B).(W䖍8XDZBJ_<3?5MCxL|̄FZn*֜ ӹvܚ"15$CQ⡢%Z;DPOnywK+  6鈼k0k7Gj%8{ۍT%g'(J>1Z]pU1Әl\ENvHοM\)R4:D_^89ۈ k]}7ֳ^G^ʴI%5}^muٶ؊$G@FpRbj֥<1tZ4~Š:f߱FdȔr*gp'ۅ'j6\1w xMDf*GGJnuqi3fhC[BCl֥u"TfxK"y؂$,S 9BLg-bJ:Y }a'#|C+jgw )- ehx񐢪?ڸ\ X-GFS+% cz"M؋]ؗ+Pgzh ;jAZ곙9J}Y97v&E}wn,-V2΢iO:pq>ђ2ƥ<@ӬQf(B3U8i".6E&(CҢf7@!IpD_'sNTaLjO7h4XrX ؠ0Dz ɼ.,6 g!)۷x^خV$Zƛq.o?i|h`~#O 3B>l8(Z_ 3 AE!2< 9q@PJ9!vƚ9ǔH%b洱>ȋ,t~zĊBfK 3-u{Nu+Ӓ+ r)d2+ʂaU$<y,)d:Ua/f+:M՝/;WizЬOƛDf o0Lw8:45pTYW 91:}'yLU \ySQd~-Zl+R 犹nP)/:3D)BlD@ԢXi-Ϸ'ūĦ?Nٌcex>ՇaC[q,e>KSJ0 yW=)V"fOe>$T j_4PД_~* ũ9!ڏ sK-r2+H"sl_ZvEZvh\T xwR҈(kI)HZ?R|~֭Sbh9'4_H>&B4 gnDhH .fLӬ$)X5U(*Vi&@(&WP! BJoExjwr ،Mm6#d;Sk!TM-jKlG)][?N"\H95Z+沣N?_ ; ̶˩ДƎ %3% _GI7U($ m,!^UUz1~jbHtCj?Ge/ES";:A&'&9Okia;83t/wAKϐ{]$y,# ;yo8L!)'ɭZi'cp5TH{4.%}^WcApB8n =J1++`5f5? 5P=%͵.KA鹍)mlNSS'6GP|A@9ҝ4R?h%v֎ ǀV).pBtZՇ:zfZ9'93 9 =xn=mb,+wmRYV81.l# _ \ftm-X tk;+IM02dEKar?g.m l_}[ 4&2/Yyyxwtr}ۡ8&PgȘO*j\Sd9{3HJːm\Ξ'\*p2CyW&]=(2ȊgU9'8Cq֜äkUSY/y: *lhMR]s0ӴA`?XڠQT%q7boLS+Ҧ ۪"qD&CZsg!8TLD9bnOi۬ts鸏T>k5r-E;4ȸ,nUR,l9@(yZ}EgXX4OEߛ)lcL j>]!t:Ǹ/g䠝8kN@$M{u0"?&c.>h=lzP":}_5)f!f#эLU%Y: KDLy>= fUyKlJ?DJ_MB cL_r/Lg{(#MzԿM*270h1+mH'&Bi TXUM8$:%UTH}87mS$1 wP_e.syUc5ptx,Ge5@~藀}ϪZqn$'HE mvHp:L7!}٬}Q s;cI y:mwL, f$[1{=T ;*Hto^=_ 3mx3, 02Z:FVcA<^ (qR92( #S|\o=Z-`6UG㌇LլMшtԒuZGI pH"!1/TE*V {[֘hE.R 7e(+J;w"b@ S7p"Qp; $#MD;3'R؅]R]')-7DT?&eKFg'f` NxNB9s_N\գtP)~✥:X'' f<ܗw͸0&^<h&4Q(*MXp5Q~$O. D91Nt0U!^C֕WV DڥaZkTHsBƋx@QIBҼ@a)<'lvΗ*ew ؓZgYL d1pۧc`%(ڱ͍1Gnu-Q3L腴GUtp3aIgޣ"wB#n賺oc8YODY8fW9,p H9,G *ht6Eb S}KÝPO.LÅ[?<%Fcj!y9Or$rSCAnPΎG8a[oEgEgNEJmPP]WTUR8)K h5XI K!i0p ( O BէQR֯`qL{01ϲ&Pd(FY5'nsVm=nȻ"L`@flm`n &z~cG1dw,dYA:H+1Ix9d>*EVNfCz dwhs) s`ڬDN5j3B[DQ0OW RRǶ+1t DJ6S)-R]`FvZd@<6@KFE!>g*s%ǧƠlpeH8= )-MV) NV_j!r ihOC_ ׹r%d`I ZE5b3qm/A)R]k~:R>}.+(b(rsyvHs&dWz`:3A?NLyNXӚYI ˰E|ܵԬF!&Cu l_~F)NoKܿ'ѯ|<2Kw! Ŕ3$ ^4Zjꀻ<j ]6MHլ6_'@r|M@k4FP*3|mIՌSMɾ֠ʲ2'fO@+7d8i7UǃN]X%,ŔD. }L,]´وËҦif蚐Ko ڴfM% 9%F; v o^Nӥȫ}4Y;k'2!)c1J}WJW <9 +JD\@,`N;E{"9Scn;.G&pBr6cC@ `/xU~#@_-R,B~^R3I@=ߟ{|\?+mw?ÐRQo=6HSISf ].op֛Se>Jy K#jZN57%E6fIh"=SOGkgf@?H(Pn^<pۄ9e9tY;6}DI=MGL("Egpшy8shW͕`N{HY4 P/c&7Qkr*ȥ1Y6IDATCī%@4tMM0DΙ"rf*ºU^ n9DRXN&ʸ˘6>GC!)kW8uwZ B1M BϷoQaF'ͶeO,8{@IfSrQV:QQ`Q&RO}9ttjwjX]B.mNXo61t* +Fk@K9 W(XU~[UJMҩ 53ui lS~-U\NJJP?"d_,[i*I O:ĦUS\&HCCo]Om&/\-G…>sL-Jz+AYmчN|  I!q<6(He|0AF[k\y3/Bw9\RehSt鷺" w]@dzhKC2SCDSE:bHix-+4Zyڎ_䘓k HO}Ŵ`ÊX'e |o_g!婄i#UF"SOMO[ٜz~m8+DL?FPg .h|V@.f %vT=aek)gk"뜸&YNS*+CB=5dx'Y VXoKwC~@G-(jPiI)%U1@wfRmֱ@_GYfoKx#Kb 8Qiv1$3@~KbWJ TYX]rjPv]n )( aPdbθW5<nDBl/ū E( ܣ{AsJ8:N Nr1 I5)^H e|&aUjoL4~zbqe5 IgaR5=tsejѸ)+iiRzWDO 4i_&< jU5yLf;Ah IENDB`onionshare-0.9.2/screenshots/client.png000066400000000000000000002603671301215300200202140ustar00rootroot00000000000000PNG  IHDR0~)bKGD pHYs  tIME % IDATxٳmuvs.H@")Qe%rR8W ;IUWT$H(oN6sJH $Q uso|7X[|ʂx0ƒ%)yܸ~Qc5?`:CHETU?g?z3H)*C#H@^dHB@qM?3͊rIYFucL ($;| sUc?7m]Z5͍ 0`'S91D"\[VRDL[C)si},R9m2hK(#:YCV ]2 2)Y-d k_:|eZ1=mf2Z2MXR|X j).!Y%8[P˜ƈbF\lL7yIӵLk w%׊ +Sc-YK/bwLJ@5ENtmd\1RT.tc!4Mݢ3I+RT&򢤭()4[3*5?KVxyt5A+]^}OeJC@Ƅ?G,+Ny!;d9ٳP!D( 1 [;h/CEU#xÇquSS2YɺiP:C*z#軖zdI<.xѨ*  }p|cw8o*BqQ#U9x癌+L&dx фvyh5GΑ"C" XWiTSr]q~|E1M&ysULoTeZ_t 5R)}R"RXۃ%& gBg,+q-n2m2]jď{cmd`-֫RJP% vٌgh}ڮ#8ȸ*i1\謠sblocdX!{?e5alOZ)Lkez|[)[H)p9;<}ɪ(+ My.RJ=~L^t#b2BZKg[!$y^x@߶ T\z)~%f9#zU%+߱a}@gR$GK1)cFc]FּWN<}ѵYx^}5ʪ/!RQ1Ҷ-1(YVgggF#ʲ9ZKwJalL#|>;,]Y'rp";;LTUE)los%XҚtu;Jg,KZǓǏQJq%VMM5۬7lpq3?;GKt:a[OYA(By}v*tΓg9S+pQ7 RH Dg3\6?YV>b`XEIFԜ$ZgLh錾ܾG IQ 1VyE"1xBHR2{ Ykf%xw2g2rU|`O "|P]H-h8gSx ''CCDIXc)$Y^R*L㣧=EUzFH3!h:ѓmPdJYZzlo1=r8φ-MeXRkƓ s{@]z:QKY$-YV B"TEwd,YK/@Mg ۛ NN`!jr>!5[ pҚ*yo}9:~>24MK8ȕD0Jq1m2R@ GBFb sA 1eo-V3}m38g֦ `)gGxҥK}hkFkh<&IoQH|x*[K))Vk*ʲOhzsTeumiiڮpU~w~lƳOY/tm1#q؛9\Q@ 2SlLXSPhʢ~o~}.'+ 6SǏoC ך,k=Q>m Hqw|'༣( tΑg9y1 9}wn>D2L&SmQPJeH!!V8BIM]u")3`{jZF0qK!p>Z7/Kb$R`8%eQ`kj#Ӛ`-}߳ɝ;y1QI6?{J^q~vFe4us~6o3/t|0:Ålm1} "ܽw}c|,*(lmBRg1$b#BjPeru"BHJu+Ԍ()C2꺦iZy/&s,G]w" R%x+gZ,$`CdX"?p}RE㲢3LצuhGb^v-e$HQT !"RJlﲹkMд5J),'2FUE?0e.B)PZXJ!J &1z$+-Kzyy&)y^l6Oɺ(PRczɴ"ZqeFeI0$}o{>8oqޡ&}!eTU:,#DLDB]70-Z 67Flm隖RBDIx4zǃ9;=|NVhelmo%p""Mݡ)51 &)[[;ӴT`bL<8!ӊ"F66{j9׮p6MVk\Ejp$r0-"8O9?կ~/}5=cU/:"/!% 6mg\v]NOϸ,K)9;'t:ʕ4Msg-t/_W.q"}o躞zg[gvglmmQ\UU3\)nɴJrMi>$VM([Cgm0Ĭ`:@TUE6RKnGhɳ!"MN|PE꺥Rw| F@HH#L&\|GYO 5EE(+͚|nhm"%)>hs7,H!QT(]6)JPTBJM 2Ƕmz[LuBĂD6R<'vخ%rzZTQC,O7I~5=;TTeI A:IO dR$V?g==b:2_ ;&ՈLJs$ggt]Кȳ7bv9bks%@gGJ$RIWkQDyI8*c4#쥒H6<51Zt2d9КyU*!FŘkz/pu|s/s ڮe4 1Eғg")xT;(BL^s-o|GY9=98#c-[;~snl1.9?;fZ$$1B RXgcHrG|GxӢ8:P8kŻU?m"I2Y$"R9>&UWӵ)( bdX AYI"?Frvz bk{ -}߰ҊLj >^,3Zb%ȋnߦJ֫pacc:H }BD |AV ؈ 9 1BPdhhB bDg k ddR@>mdBP;z 1P9 }_|*xX%eZ^-0&eG$"*0qdyu.Y{O,5;bGf(M3ML&3M"ܸuƔ ws)hs{bj]cDeRh")ӑ皝m*p]r~69D PRqxpn B dYΥKdz;@;sʹEI^lmob|kkI!₣m[ܠI^TmC׵x@gW(/R3!bl:GfVt~ޣKozaDJAӷϛ<VL &/J\g6[$ٺMܺQqDYFQeI$0(FƚAfΨ ]se21ɒifi"b$MX)Ms)\Nih>)[[y *y{+Fg\QTcv!@5%N6?s\'%@JZ \#$DTacllH_T9:5>*a!BKjiɔC87M)Z@6YO4!$rpM$*I*<1!zszr|4ghzQ*H)k:ǻ. 3Va IDAT!s6} D! 1ը" (A z .>aA2Ҍ'Sկpzrb~FiʕKe t.9=;Bg:uJjO'a$Jľ;ϭ7r2wヌ]m$pc* zSUY0;^8~4o2' 4suj,0}bi䣍(H0JՇUB$Rp,espOݬq qik2MQ^g9OO$.i)/ 1>gATzcx4EQP7 ]ۤ" Ŝ(5Jii,ysubl*BF&zj< d#?hlo8 zLw˕ډ4ĦX, ÃBKl߰1LCkj5m=xlz]N7p6q|rF4]ǥ+yqr>1 1bhb@D,( !$!4 g$ECs9=;eZE*Eow0y@ ~vO4͛7}bCE Mlos wX-,s7"zyT }v-mSCc]HMRIrZ>|1=/2G<=ƺ'ǜX=8}0`ɲ1Ft]!RFġ&>{>7V+,PGjr=f/V|s10??GIB ȕ+oul6#4pCjGe͝- iIC<;?,+(6I"(SV51hbȀsD4YQ>)̭m66׾+%%kӵWt0$zBIAYX,cZ\`9ZC J8::^k`:Gh=#1ǧJywO Mk5E3PߛHR(KVm>`ecjn(?G&#K"1Q:/9<4y0}Hva>epxda:1]G^!H `L{Ϟ=]ɵ7^ǚܼqcs>ܣjJR|~aDL6ښIW&Su=W._h>} ,Z!#BD[X-i?br5mjf=9LmOgGO8?yF^Uo X.4KFc2ѵk$` r21ۇx7(g45>O>T}d\ h-K1Y9mFgYge%Si|\a$% 8r>#zG=$G1v649}f\7w{?}L$jA,83~D3"]sEӯYq%WmP1&CHI$vX,ӷ+7*Qb1OztTNoMsT(; -ھC7<Ŷ "8õk>H]2%XgؾD,mv oq7yݽGӬQ2w-}O=ZKLKXִ͚j1M{@@Y˜)#Ӫ2]]W3\-Xe$2xۜK999>JlqUq;1;=ccS55[ mZ!D5umQ cH<ޘ11}OS!#/] /4g9L"DřLJJژZS/Z+ȴdZa5%ϾZ׶-mFVxA`mIޒiB()"Z"ǚnFH {~rmɵk_}7_JpmijO*Qzr.\[p>#ܯ?ޓyq|vQFP?i!"~!~Я>b]|/3u_z5_7_DLgv-~Ș !ptrƿ{q{C.]7B޽F@q^ {a(oo|ǿg!!_q|`W?_x|ԀRG?>]W/3^_;+~C~R= ɷ{\#_G ^7=B'4MϨ#uF9>|pK!IG?GOyKsnOj _//CߌzG~n}}ֿ~!]Y=;5n<&~w!z~ÿb?|z0LF … 1gt?B5W\m?m?3V}i'.GO("k)~ ~mم? ğz#:9ǿb8+~ߋEvÝhRHIxoakWp.]*>ׯe &˵X']׿(~ )_Ƅ .>/Uk'z:43j2~징M,CĀ<9t<ϩkOӭd{ |{~Eߊu!)""@}?9Ǹԟ:xq_'4pa(PJRޤ?]X<=O=옍I>m7'e?!>}8]/^S- ^BDDB9zB@|u c,:OYH7/QD:~&#1~>ӯTh(Q|/~z?<?xq\_Idrvk}u_g|j-K[q6kҔʔeLR fahKB[:B m5I8Nq}گq%]NTKҽYs|s@j lLahx MёXi`C6]>-s\*__9[JY_](!op#(-gT$H)nu _^ދo|5x3tEQQT|aZe[dU")h(hFBK购\ukm#G"lkgeл\wVTЦ 7xvY9ť3FXN)nR^S.⿨P4 =%ljDrt!+ ;,e Ҽ ` $XJ'IJF 2Q":+Z-koV{5,kLDqY w)'eH"4bM476NX4(: z+|vgGwÚ |? ʊgeEIN1]f!raU}R|wKKӕU/$Sܻsl,ۦP(昚&=3I&-'oh$gm;g*r}zףc)ʠ+ftLYq 5hdYff2d2 a`6J{*$%QPJL3N+/in=0nԝ9A͞xEM)xuqtj#f: Y0[g٦a؟|gjlټEZj1]^$n@:ݞk;O^H/&^nnc':3jZtߚqtHOO]w7#Uusf^ GkVB)g A8z$B$RN5 #$MPNBmzƍnA4e^}N/q:M%Zƥ)x!x -'݋#MhcIL(cU])+g@+%*bUSТQ"(M[SCl_m 4+YA/)4O!]ԕ!4=*oRy@}BL 0Xq-"SHETP(N,Z'% 2/|VMҳy/xds24XmM@jSxG_cx MחbjqbKͲ֒>gk;s1.E(H0L,I)_BPUC P1Hcq:;}+/tY8 vK+=a$z!*tb>-v`+}R:.uo[ޤK+~ _ϣP*8cS,B:;Y2mdzN\~n)s!U_ڷt(q(Xc[L s[JceJ ڶ-RX^Y>>)Rw =2cE,ۙis[fy/IT,P*R eC1𫳺}/"t˲Rb&CCC:)I%|sͽc33J,]|F9=oϵ$Թ*0E44UCSut]CS uPq@"drb?η9XXXUz m$KD4BVlz!0-lfHg=7| W+^Py_CGkP&. bFj m(f8q vvގnpLb6lBsbp[7cw(sװRhkk)D杷uk/>)[y u"ˁ3-i1lJ}d4kwӳMAZA!ܙSylN2WlݶVV&iP_׊]/-.~ZZ4n4Sع([Ogƙe"!Ѱ}GPTEIy)N,Ymܲf`xLfTk'?3=p|yep|0 dt}Mf8O<{Q"Zʃz7J~`<[:'У:=;q[n%)h VfQTRĩSe۶mr IDATQD8lQK̂kvCQUT~ jnW_ (c&%hnkP,G r_,̤1JE2L^E *L!@(HaFL.U-8PvVLK0)n!vVp:x4Rl,T؞&f=*! iX;=;pUWrfH<gۦ?Q3;Ӝ:uFp[Dini}e|W| _,aP(x3̰kRpa9z(J,ŊϠV\|nߓȮJ4XsA&'FtQbBHQᩉ֘1V'87F Cl}3:pEiS:#1׸]?ҫ ^z^Bi-BD0 G3<<\N+z+WAr4۶eaa0ET ͞PWf)?V(콝V%yTNlJ-bW&pvt鶏QD*$QHw3R=8z/ n7_G}i'M\تnᇒocW|Pw/}[L@`Q0=ę SoTc6bmg#ӗ.riz_عa +O$I5456ѵِ|TCDDpiEiU]l߹'lgHf%j D߰ UUò-ٺ}xCZETDQmwӲ(zeVs.vn&v-JEC2EAmc5~_ĚȱFذVz[6/==N:Os[7}wݼW0ãnݷ'sIO/̡|#"?AZ1Xyt/z޾RlIYao绹x,L 1Q253ɹܶs}(zi+񛋠~E4֮]A,ˢ;vNMA]2eXq ô@ ? d4ƩH$x]{.*\v{¯s~)*҈"UQ&4_b訪V6R,´m,D]lF`XHE@2Q%0a#bn\,0RQAB/Gon?\lPCVʺ]Oc gS!+(BCY`sI()MPTV7rkہiÄHe۳vX>.G:8RuTia\D#qU`*EIp/p[yR DtTUP_腔TBWHZ+^٨1Bh:Ν8M{'@:'G44MT=O"!"HǞ0MPFPcI4M'QMq$} ~b ЩOPLADȎKڴ;p)꒘E]}+M zg37s~0DPqPUX,F&A4W0]]d"c[9/;pBpiuy]ؼmq$eמKg4k&.yr}ŒSVY n"J+*u "ǰleDiFF226M ]UU1φE9Md$#!n"4Ј1%*B 3#ؙm4:B]|3VLwAΜk9|IFf.10w#_*}\OYe:GގҸXH*erq&LjŢ$14M޷8mc&hUS]RuL޹˜!$n@>ƀUbr ;WQF'9w5_envl]B2e5ΚڿA~Sotb?gɉQN=23dw=ȞM?ۏY209wNIW[;$wc˺USθΏ^@i غͽsnu\7Vϝ;ǹsD"D"b>(Lf;^5cJARJnn{ {BGG'eV{k׉M/+rՓ[ĎZ#TEUDbCcs+]$Pm(D,iؖ@UuTY!57C8Ph&jJyI|zk#ő ץiUEp |G#Qvvj)bzo3\%4E'8w |l&M"p`&eRlG} jls70'j+v}L|<(Pu'?'{Mh)%Zht rƿŸӔY1.uQ8оn1}>c?JkK; Ei[Nm5u _?Dz#{ C]s']D4{un~ܻu΂a4Auiؗv00 +VMcc#huuu  )ҙ|YSH)gybZ6ZMcc<;_]~4dRR&ʎ^\,qk//SWQ4]0 P,(&H(~C$`[6)_?[_u%5eeqtWUD,a(B>02ؔ6(**tajLƶmQF1wK"FP´YB(BXBUTQBGfBQ(؞%EP[+JBrYR W$*g(tI3<8mXzП,캽dZA9( Q$+1Ru ,`TYU%@d9Тw(?'A)gb!GtH$jٌLUUl^B:6|h,Xi(K;AhvB) hd~SܳR 0+ϟe199Ɋ+[O(؎i ِiIǡdNDhJiue'jv^;R2=[ XM$`8eQ/t&W, bɜ}f+ -Ōe)`֛`v\@$_8J]3M(P_UkͪA /X-_M-\t<5mY($R{@rZvKI$ ce-Os{1>wEQqpO@<,5[3Rޯ4yh4Z6?%>45b[bh4Fؘ d64M`^qAkٵaVْ$-%.ر}<V(XQG ܄f9ᠠi*ұu-iyrY2JZ熦9N&XD& bp~u^Ϡ(a_(M LMJ#T%ЊPJhiih4~)-b fV^ kEq;Z]lߋF2BҾh,x]innBsqYımEǸ|A|P\.|د:/\/J^K)) Slـ [-᥂t{뙥)ݠ:j~Q¶H=['Oj_ߪ"Xn-*o۴ E((٘r|L^G|}3{J4H찦 @mvFt:͹gKXM#ѯ.o%M텠a`S9y{~ x5ل8s*5oϼO+&T Ƥ(ګOW, :Ek;w~0qVAܼw.PqwrWٰ&"z!܊)c e,%XñdtL)hH-Lzɉ%Ē6Xx7~Βlx&6mXQ¶ &Rlܽd2mۮ6n + Y^W:r/nl To:ƾX va8{-@2rXǶj s63ꠡ>E>f&Gɤ5T]'j. re{M} .kk5'5W&'!%L@ r]!zJ<33Y%ZB `,[|D+.贗#S{8/s9grxsŻs̴"㻹v翫*-fGDZw-7Gw^' ,iĂ]Nal+ۨnn뢲e0^ v7tT r!!/wjA}eͣYG$SLǯ~akZe/fdA}|J>lDkt^ Hտ[y/ڇx ;&7i14VySC= ;U"PTK{rjYYAcN61*Q07~߅ 'gusvV]i߅]}Vg [B 5dmy}*Vf,+=-XP\n2s|^W:WOT<8BbJ8'L2۲(#Ftuv3Ϡjoh>ɥKCEjeXX',jljip>Gt8*JńY*}hUpJ)Qp)]-L*Jc?0ef&p~kثZֶWZ4~~@9:Xkj9b7h҈9,.&ěW^-}M$$Ϲu?ǫ277忋^"E,{Da7/ Q`'G!jWaha&]5V8:bc[HƦ&6oBQю=^l&RX'֑4{aLct𚔠PFA$#7 C t]*``1+ڏa^^W^} ԋض`~"P2!*&^h4=p[a{^^0k<yM+u^{* qiľnk+.6l[n =o5܀ڮ>iw3~ {K%d]/$/kqs|߄{:H(†E1T F p}羟ﶧVeHSK%T}0D% 4M!؀i{O?Q4(P*A38G&A``N*g;rw!fH^UkB[z< (rբt4F^N+~nߦ :I͟c<xkWOHC5}c5}ͭn~qϥ6o(ak~r,~mA=l1}&#}+c;x=twq35EUJɸ-˚j^r0Ȭmm1zOn=yZ1ZpcnrOVs~f}UheOWijh^2`=~ 鐙Nb 6os1R [YEUUP5]QXr%M3ӾZ jmBwvq[@^‹i]7y10kM8]֖̐f)J9=ǩ'Hi2Hofo%u"nE_7^ލD N?!^ן^ӊI7 up^M;gab]/{&7F[W7hQ:i&4} 2Z @v [O5Z]Øٸ)Bjo s $WaQa1nuk?V+8dJ^m1ayw{gTdB Cn2 =yp%s:aېJZYLҥKKA44LeEeH&c+ٰa=x[`PxNn.~.5jIu,y^94i,ˢ7L&F!,B@:fbb $Tx<xc^W~MWӺ҄ xkr?aTNsS?uZ)8$p$ tFL4b~7H~uA7oJ0W^ڋnv[aT fݍ~ZK$6o+9N1/xem]+z*?ȹ)sN`%}n[`./gVd 9zE9?+ $a;60p, Mb(SJFN:E `5aݴK' 00 {(?f0;ˑNꢵUUiR)RdY'HԴD]P8 tĐ Anzy s a4IAΜ~B$AIjѤi8k~ G ΂4ynίaîU_ו!Z[Ɯoo v& 0l~*Oph7Ln4YA6A<,}^;<ُaLZiznjAfW^~X}gFe59X/<\TErc&UM#:,ALv@'ʫ@?ePH?uwc \ld'^\033C.UVDB/T*ŦMdhhaV^M"-la NP^ /  s𩥏aخq"Qt]4Zmkc] }xMgZejoP5ZXֲTksRW*B<GU@0qe)oNf-i7FyضMT7Gi*/(j9axm#D1IR]죘/ vllA eVe.L 4|قv8彊W IDAT@u@cpA)%Ll6Kgg'^AD" b֭DQrY.e,JY;, x=J>'ɰgϞW}}=tIV\Yw:A<ZnrY.e`ezzP@%R(8}4Ν#FYz5===455[.7.譞9pf^LX|x`AD#QڢLO (sLBch2b1`kXy "i eo橗/ I"ZjFOJ=[7ȗ##453|k yS19]O?y]+~-q'?޽{ٰ dz>md =Z]3k7΅#/q{cU? ) +xݷy/:?}8{0/zCtX@d FF'Ys3HDR̀C|kd }rS*8q$RKtm7oEƇȘfn -M4qjHIfzދ(\M[XLJyo 5T)6-+Yݱ hy,=ĄEEKbU7W0< Fڛb V6135T^aCe\tT*166i/k;myʐ/xMMQYQTE.%"fCW=ZٷmIԓA)0Q[/39CP⻏?{n&2X%2FmTEV.~+N#uk6ׯ+ФX,jLϟ?ϱc|uu N:Tn:]D"8sLLLE__?~蠿;w.X8SGzV9>W|?'z^dl??wWxC>pGa~w~~8SL"WWIc?{}1¥Kt_qc?˼'>D5uqų O_QDFZyݷ]Xσڿyfn_/1RqQ>>b O~ᣯqQl,GY}Cr>N.x4vmÌ_%=#? ZlDOS}I]1N ~?M@X?>ZA=ß?2+Sƭ;I)yN5/kM /\u0iSȗ-39lh #Dc. O=Ag{3l-ݼܳL - _>̾{`ƅsjH]C =EK::qWַSg2j5s߾ :bcf*q.7e4 )W7}eƬo{y8p{(+V xPKQTR)D3qm7F4OƓ^&J~z3rpS8ϚG_t ou'y M+P9=l%9{'ǧشVn߷]Y6qZ-fz~FFFBkx(~;[nT^qstPR`[XHJASU )$gָ)+y=Cu@ut]gE‡޾1S#$v4͇[IVժϝe2;Ύ;6sWسdOddЅ4rC?rWo7ˤmuwwssI4M[oka_ ꫯb  xUUŶ+af) +uV^{'?I|%sݍqd[&y'>ů~>ϧ>{|/W'xO}߿w{?5w9|1ebܰ{Lgin_˾ogۚB$03cѧ\, J7C? L;O[ܴq%0\ CO:V6qϰ _/d LN7e#ޫܿo}<N+a2gK2/Siޱ_ָ~}|ăUZؿ2H 1&=w1+o2Ͽ%|"wlԏ[^c* wchtsfSGMv/@}>m]LNc(b5VZ[[nbv/ظvLogM66YŋWغiJE9/ܺ!l˟Uk3ܷ>YIP'w6|CoxD#l .㏑=hshp37t8-ZN_#lm)-726&^o O>o|Ox\p;g=DSg/ҳqMyg&)r~M'Qޱs+غco4]BfX>3ٺm7{֒ݴ?:u Κuzn:rt%%FNLvfeqMՉD046hsEMցA~ftR 3LM;}!FDۊv=y (RB5cf24c U3vo# Ν`&6/K-Eo̥ Nq FLF7,VQ%ga/{ߚ{fe]{Wn@x8xl<scpc=s02ƞ,` RK[^1ʪW[%9U~E_|EIG֫CT+/mPi49ѽ21VY.I޼0aް9<o, > l۳9u-6"IZ+LaSkdk/DԵoyj2]=4UN)P*tFfN'XlnnR(VN^yUY>>|?|f) wꫯr髹9Lĉ|grrVuu^LOOv'G99p>gf^ }LT]J:r)\ggK̇ | wyxkg|l3ӳ|ǟ ?{?/4RX_Ǐo~7w$4+a^Nli擿دPy}`kǺe^=k/GkxBOxp>oArk_% ={P(OF.xSN^ _=|u:>~3YMH]G8#yJRj zbis;;;K-slmmt.vjZVu1۞SNQٳgUs8! ?E/rc1K.2 L ާ*1M҉//}Խkq/p[ѭe^:ɱS>y'O293MqfΟܹs\\Yav'^۾;8X~/~~X[# j+ąI|给lQyoMJǞv~?L{<vyK˫,̔X:w'OUyhEuf'{嗞g}w.xǾd& ?X{?Ӫx߻j|?ϗ_83?W!i'd`m2G쳜={Zk# }# ́NNNr;v5}s.]j07ߩqIΞ3E3ܳj/qi|TɧžŽV̩\^1[#w3]-Rn%gxǓw=E{hJUCd$RId`6k,ཻQ^'O|ӟgK_>8qo, ?{l6 ZQ09=MJ*=?2ϝ"s*5WhA꽧nHxB͎ry'~듴Us+ IIՓP5H^S޻@aS$>t_wx g{I»1vW_}7xv}uI}XsΑew} ^v /s=ǁؿ?!8<"o9zhpw'-I晜ju5iO@垤VVC:IkK|'3c*O٤y2q4~GY*%~c#?<űYCYDʭ]J+deh6dA35QӊB Jhs:6+JX2tpJ"ZNWk9>Op ޳n929N<9{v Y /377O? I\qc|zHc"6$I ֚qdCi1Fo2KKK:?zU?p.KD+oo:=DQO?~Do,otht:4 {y)ʼ `Ϝ9Ct]W;3<=uS)*1"SXkh7xy"gBռy'Cݻy̧8_g%0kYitSr{Csϑ+iX9 GE!VWWٳg{.;v _}G;fk?LNN^MEfvvCqQ?c Չ+Mzc BLtkjlͷ<+J)MR-O=ė;yc4q&bb0{Fߢ) ~:'|a7X*!yy>SOq5}CSS(hCW#p6 7;qOdk7Qyr O_?|0i4'yyPDJuZ?:ARE2UjtrN;nJ+ˬSiW7JgqvkXKM[vHYQ*7 ihQ; ڿ~<' y}oϙΜ9lAkw}qLK777ɲlhWX{a߾}Z-4jW*[v>>w*SLMT፸P~'X]@i  ex[2VS[k9vι7oN7pily+ū8OͻaY=ʑ5t C\(P5Y*i` *%QZ=|333ཿˮW0x[B˅BPy8vto;QF-b:cgg`y^ Ϗ\z* ;vJÌ>鰴bngҚj:D Xܻw &IW'7PF@7mgs8KkhqfayגfRW/2&HZ(9͒jˠ^oIRʥ"r?mo7z1ץ4ئMGv/b8!Eay2 oȻmKKKLLL0333tV=n'cطoFAq"˲1yȲG ^^[i;1ikyʺk, Fڿor@\^sI8ИAW9wϟì.-SAnj4 *Jgyy$IT*o^ѡ$I$n6>ksƨγVa e孤yѪ^jN{019MZ(D,#I7G]ׯ7v7L ͋迿Qm 7$bwf3gΰ<#g!Z/_fuu4MҥK,// {T*aaKyD^lcLn *sФd'ϓ'QqFoYmXϸ1S6︺0]oؤ|,y+Fkس2l>L/wP(؉Q}W|ar'fQ?t6T*1111qTTX[[ŋw\ܰd,G6GG]kXq0Y۠0Q5k׉jzϑ1WU87Gô.x:i7قњ4Kɲc5>x4fiE xO9:.*Q80gFxcyA:*o@,ˤiz8ZR*9:FMYESSS(;1TwnGA8y1:gՑ GgPI=_&:qs@ֿ;]f|'6J?nqVWVw'0N_W&j;#vgܬ^LDa3u~q'D>q?m׍ȸն? gSliImnv̾Ψs:tqt3>;Us$i iཧVB 7Jj63G͈ʹ6P f<$Q (7̣}Ye$I2KKK7~csݳMu0뭟~93H+ߝQA6ĸԷjC <b~haq\mj5_&AI]J\ p㲌I.a Vc-YMk[-J6ʓ12Y=9H3џ"p_~\(fdwf;3q}57 er:~OP=B۔۝: X 54ũ\ ꨇ- K53̫Gܐ=uR_F8[7fPvݼ&߼z&A8vޑA 6hժ?W(C:O9D(ބpq:hQF]y䨕ɷnGMvA ׆F2Gòj 39#OgoԨqle4q5IDE}˰5f͜j^cכ9hpyt6AToV<̃[H;^nA򼻃'{!Gy?Mze3Ȼ;jSo_/㼁gT}gil*V|{uP_dp>E  ®jS.W16B+K!K2|hc1ڠ@@BWP*UD  ®&NN'XVIJR8FqLX@Ne ZiB&  .7xe",;sp]a&J+qIPAA81Q|7Bp=֐& ZnC^m8%CAALl* BrRqw=>x\Y!| %AA]Ξs۟铼R bdi MӠY sL   JҴé'9}4e=ʧ*49 <9  YV96,Dq2`# P)YX\`eeu랾&  * +Uj[u2URڹ$MتȜGkCE  b@e 1sss(@#$*i5xsQL&"=AAaniu./sX2o{ h ^AAatbtDP(0Zv:$/d'.6B)CuAAAؽ4-p8hhߵ&x6LNL0^ΝAA(Bk#KYR*Q(R\V*S4[M&Zk%!  PtSc;ۃ׈Vk#4v AA]"&&lA5W^(1zi2+xcЅBS99xBAAJ%IJ^AAa7$IX5Vu Qyح-WF4i; D  .FkMu06"06k-; )VAAR  c hV@X*$MY[]E)6&BiM3QݷHubdU$(  jV%gdi5Cz剋*Zi"Wd#  ,H;)J4MX]]b64 .#4  F̃m*SShi5i]OJB'\)sA  ) `A)EIh6[lnlQ5^gϞV"xhaAAaS) &U\afzj(^\9 Q [l,IH  Y&8rd?6Qf9\P(ZmqiMd cA(  ^BT'&uDQL\c|VD  %R&{(mJan86x0ƒ)ih%AAv?Jk2mQJTטZUJcyKpݣռrȚ  )'QՖ,M;hTijs T()F]$(  jԃd!*CXG,@=p&.ւV؊AA]1ržy}bD\dva =D9EhI$KAAA.H»6ʕ"~]wߧhXkc SE-Z<  F9Gmm/|sh6467y+ϱ"`ۭ6> fuWAAtx,JN;ZTX¥)q)yOf(1ZAA]MRl\@:M|0J,q(Lwh6jXXE  -^&\#Px<(& .#M:xl60ZQ 6d"BAAaLJhB&_H} !vI@k֊Zf)AAv5Z+4yGPr9v&gO.AAv5iQ(QC@)AS*ha -RJ IDAT*vb}m ,LE  .FkMpPT.ju$ZZBc]bhffP.QAAؽȜfvZhc@@Dm#$c~aHPAAh1qLR:I3wXk9rՉ*:-h &(+c)W+"AAAaWchw=>piњɉ co^oAd$m kE  ®&xK32ldqYF̩d.E3GF@$!ZuIK&  r8爢4JAp,KX'^| (H9"  Q`9OT@) 'z+C{16c".!OAA֠-P;r [Y_*帄֊(2HPAAoR$dA)&gQ67k!x,%UBq AA]P)ٻw[lmmxH[_ 6KEZiF: AAv7,Vb(CX)B9`wDʐ)zv"PcHPAAD&lsuA)dk#liF, Ⱦ5AAaw1,C1cmmAkU:R iAAv5{QyGp|YR4c B|)  ZqJ̃Gyl-091R˫5KhAAKTX*p1Xi(*xJr!լ᳔BAYAAv7Fg@q(+NM om0?Od4!x  -J Es'R 6xOů}s91xAA],!4r,ݔcme.Mɲ B  {<\E(xC;޷oB F(XX  5* z!BLƹ B/-':Q2X#IAAM9:IJP%W (6!- PAdY{( AAL()J,_DFQ6I.\B(BtZ 1xAA]M&͸x$І >ld{(m%25k"EAAa|315A M3ZbQ(,xQ,PAA(|FPAALOMQOR|"5(4!@t}XΑ& {6|  l̑(KdjYYY!Yк `$-  IySO"K:#ў(lk-w ]   zA:|(w(1Z-t:,R.WHҔVE_  GT'PƢZ+lT@ ^{5VWWPwڊzȜB I@L1ٓ5^zy.3" ƗM̠ф̡B@)EF (EurBPEyMId(ē{ȓ|ڊfkC`AցK E*{lssWO;$dYh\.4ۘك k-I'$x.!rupGb~<IԠq7\Ƒφ7r>Wƭ{ g(Ony(va^yl:swΌ}O73oflyofR^KMžIt'\G|ΤpYF\x>pτ{Q6G'"Ec>ȣAZ|sGמa#kz.ԠkM:>FXAwR# ;.vtxKPt6u'Wg6ڊX`Ui"e2wqyi44u\W[eXe nB1?@G?wP! wbwqۚ̇>58F`r?z uc# ÕZ6]Rwsuͩ3׮1Egns[=SE?[/kADfX_j,epY(wb^H[d(i(Ea9 Ou=" ^k][TW=*;Tnyn\^o1~7Qhō;T;aQoΌUmՙߩ ÛՙJ~SufP]܂\7Gg.w\ѧie,(:/2ICYP =F8&X3|i6H&N*T?@T& ﯌=~`*z,yKqmPyjy=5Ž#@PAy\ }gޑ2pߣpw:3P73u;tfLtfdTg›U73v ҙ́2%&>2w+u!MS4'!Nnp>EiM2V.%"CCsJQGF:^罼q@0ܡ9ɻ=>* zFrf P`-֡mԙ0 o.3a7L=:S3؉=b w 5:Ȳ:3tfh__>жO0 A&5eP}@iE!.`C| I`hh9J `fpo A[b 71!qCyF9|R/.eǴn CgQl ^ycEPWvЬ5slusUc8:c X}% q=T(IKD}tfFsqtF8%[ iz&ٖ~f@MW\4r!2vyՠ5jCTaa^Wp!:Q%d HV2N4zCc:T $Z?\7Ϗ{/a7<j6}s;1Z1tY6j][Ds\gPo|>ŏ?~m24xv3&hc鄼V#oL~m9^DgoO̵w_[vУRW80{h8^q>2SL͕:QCpamh*F+ 7!!|Ȯw]Q EQ7 CF!0FҔ$FejNE9*[4718+-}F{YV-%s{~ i؁M}_{KrI}\o,( :Ɗ2׌]×XKXr22_[%M7 .( &f]k)ɕԅ!5g=O57f;/Y}1Fo HT 6bsÑCdc4u` .v: I'!KR"CzM#)oQ@9VTJa3I!4fyJJWƩN%Og^It}VǑv2:ِS^lSt[I ${\Сzy<ӡ=^]j^\ U7Gߣy>ŞrZ%lj@=6薻8<׽DTx+Kgpxֲoq V_P4~s);jL)W q˞g{.4g'~H_[g2K]Zg"D뚺OdbF3Gx(~ތگ5/\sNgNN야z)/7A>8g< m[}͘[vG_~Tq(t Hy*%Cd >qG7B~4)ss &c'yb5vgJ~K6o_=OCQ_xCOw9=o|$)3c`^r}]HS/j˼X,Ru;B_HNYy|gI5vwÛ2]IR5_7أEfnqkI/f96-'r]`*#=` ž*CNIxT:1) i>X:l&0=c9FӲ]'_@~$|ACE˛W4Gs;R&az.tt:mKO~Kmg$P鷯^[}7m4tڵ$?v$L+eEzR=‘-{8HbjrnE Rρ^\5?k4 ~<N֚(֌%DkZ|`By(T Dڭ{v?: Ħi[ SV uJ; &'|bӴN=HI ~aGvxT3yyu9`4AmlfVDqu$C (\p5*qѨQRJ|aԢkYO!pŜHsuϗ)k>1# ~=䆋oT1b.U*8[S5^17,K+ lXlק9y`玤cOz|1rꮆ?~wMrq.? 3V ZQ?XWk2>?u(ٌ *?\J0*Gqܓ$ r i'fʕd/>Z`,~r][DGtt٨k"٬<1%ڹ:֜^S<`ɴB @>:;h; 2T93{/QOq s'J\+oVq'Wg-k|H|sV&˫1ỤH\wTԠl{(+PiTAHDG:iqyJ)L0s-}xl0Ψ`ؼ-ukm1nUgZdF3`QH%<:ڼwglʚ̢ab!DyYe|z;!;jckٵxJ!%dIʕ 8Q °A.amu8 (,݊d= ?w8Z5#[]ц/j A1䕅,<Y2֡az}vIь$6B2 wsϙ K+ʩev2@3ekmU"b!qeG8T ) F4/ N;9ҜėRয়cd۩K.gTVCܔ;Xv_m{ݯtg?^R#lWOe6#ZgNFG͗mhpkS*ƼYwFN{L~3҆цk7+\ m l@:[4Sd{ ldzlÝ5t:̃ 2Az0ϷjF'I!36KuΖJ P.o>]=P1aa|sϙZ͘co1DBn#0̠[mS^кJIF)AL4'KF4u1QaAfMjLв[ Sn9=b!tBjCrZP sQs06Hv!nPt ;hmh q\+jZ絍tV6Bzrf+!#iE#T (Q#Ӛ&6G^+iCPLI~OK^OE A싨:&4eU}SLМF1wr>KScG =RI߁ {rFʠc$W#yβɵY'[Qt2>!Ρ56ˆT*RGj"Z@;ȌcLI|[yo $ν]07kv|Qn n>g.,hή>{&߻wj)o ~ms46kNT^uV)JACEH)q|L.GahٝlT~wG4yuwt HD~R4+tv@+BtE:L%s\W4tki4Z3s|L'2I 9/>bxJ@W( OP<;-Czȋg79=_RGO.9qBm=EL2< o7 wwL[P(<\:'2q m|Ujnqߛϵ-.W6bdx s<**70h ((@ZZvqwkJxFjU,EX%:V@ r:5;u18fvv6M {UYr8Rp8fW(t`O;onW<3QA΁R֡@!\B93|"O'[.Q,`=wp5;]%ĞgR5^sEI[ú͕:=…t+ȒJ;_g"h[#1倥VD&8 ލGȦYLьh}N]/(O1asN\W?=8;U]~b{/wdj~)o(h#l# Qc:Ucx+9#WP^x}Yɩ^̕ ~4R,oCζ׾r1@[I._ΥKq8Ҹ~  fG)IVCPR48BвK].hLG z"%~@̕JB+U_8tMycJ alGhI?׫7cTkBSҼ[9Ly)ɓ'Vݨ%Cj;8"z~L)'Yx}JŐ׾ɯ~ɶN@5_cŅ:7k.%*2c3ݬFsئ$O>7o]̷`Wq9kG~g벝[y]C̦;Q۷+jow{bB+B?PU6k̡6S-BO;%FM3E+2fX*My2]J5~u7䅨3xuMcV0C{}>(x{yXG ']/}x+C^-{CgP[%&f096}m0q|ZSR >\PB9bQR~t4~* R>I3:Ճ;a6V-H$ iJ!O$ƹq:h$d ߍvFG%Yu ZOIƼtMS9t9RvEr0dzR܀(j+ 禚5c)s1?sego|7ZVTIي8XFYB5ٲ|& .Ƙv91 S{R|ͥ$>sW*F+uvFpSS|WG<[|~i|GtMQ۹7rks2T ;N<[Y"++ңXHlVj-s!o.rQȉ/ES gش1G@ .av'mh;sO*^[1jMh\ $dW洉c $%|DGd~i#;CVrO;' 워 yGEk.UqGՀt_K!*&[y 3ͬJ6rۆw!NMl}]nFJ\~8qx~ZA1JSP աewx;rn߷_ɗT)#S~sԈ?s:vt<;ı6|LȾˁV|V 'ՙk|TLa|)//|yzOR~Cbh͝k;/Z\r'BuO #  p٧FX2f0Ը9YЂ[C[yc^&y!ߊ>SﻼV㷾=ǪLq@*]yR)mSL8$Iҙ,R64_#Vs}OWb[[CCԑ;>7&j7DBOdvW vd)ROOQ Rpdu]WUzb>6(Gܟ UwDM3᨞Ͱ|[gC>2/^(1)fávuW)ݍR#$a&6ICPD: B4tzа_gBlR44oq_[.E;ҽgm:mzXlRBH#U51[7-"N 5۩ C'ݵaup9`Z,[Kn-Z V͗H wn+nDʕ70ɷZ~{0p1_W5m~goRLe6zR}*uχ|bj?ں 0'e酸϶ZJW!ƕ Xƙ5k/?jK'w;htL-?=(gTmrwnw 7J xIK؀1W櫼xJ{Cy?n#݌yb#Y[/Qmx~2.Rh66KDa6F>ЎŲ+UQEagb֙IL9Wz[֍.k^B&՚%m*zDraMm&5" +ihxʷ1A=8젃޾i_q82SͼH7=;[坹8ICЬ{s9z7k#d+Ҁ;e0-wv'oGz%P^3R(%%`ޝ\HI)d0p}1}wՍ o1cZ(;'FFihíuZш}9T3{f_QiNR/Ldz'5nQpr!@N˯U =9{+`ġw%*Րs5ޙq1=U 9rG%AdXZ^PL5d `dӚj)hrPFkK)d|OdRrYKF wѬbTjdeHk*W#^YVo4+w,60z4[+#&3ͺzȩNެZ_ _{JB=(&7^d~qY\p?|ZMW9/gH8sq›7k\-yF x3w| y&|lsT^sN^ u~g^n&5Dt@H:&ҚJN\Ig:t%fo<Fx-5]ѡء_[$g!qFH| ̷k;4ĭp( ( hgi29AyC$shV3ufH։m ,kFZ^1h!|붏[ !|OeQVkԂ58jij.@s=aqٖ[HpUsK 9;Z6 )qt hƚjGI0nHs![KE<%&mu#\\˫ibbC#Vo1i._]@94=ܶ,AU/M*EkZ3 aFZd"^ué 4{Ɯ p3j֎ı&iTj#Z9^v,Ʌw"nfNk E.? ޺i42^N" Zu ՛J}Fܼj.$}6 K<:0 7BquTw59CGҳϭ í(A&@6:fnl"t,Y,q( Q3Kal|jyKejBz)5,=K^"u,<,Kd\l~$D y)I$]2uj{α܄(j(0UAɇ;9J$ۅ?[ZwbSF!(̫B{ [drH&]'n2hlNF>J%j_&x$%:ِhP 6%juU bTZmT'ocTQ.FY!]o-BH|rF*iӮ'K9v鳥Sm $K }C'I&]=639D=%vI$0NC:uO5e&m?gG"}֩0kbZv/AYelbd*Jo>ΟpR$0"41L-m:W'gMH!k`n#o n)%4e:kCOv}Y\nD;6lo[ ma:Ns{D FF)ezpW&ǚSV)II烱)׋kCt"{mfa6Иa3[:ã[ll~h -_(f {af@;a]x²;~!4hVVYXZ"ΰqql:tE2X*NnV9yQ^n-o]7`{wg:y={/m8j5菠Q2M&+~m/ן] Of(c3}O9c`y6ײQ($055&Z' C7X_^DkR <Ӟ?u;bXkccvr2 $oa΃sL^LttrU L޶NFݷɻ~?f^̇b3U524#\^ $޳ c CJ6paN-2EϪ oo3l* s+5B:G)>8oßsŧW#ڀ!^.Szdl.? ᄍZ8Y{ިSWH[Zvշjn?t}fhpP'?\^w_ݮr<͝ED'Jݙ~8HҤiqܜpDarL-vΛ 6(rٝlm=hvt%n' .evgzm3/oN;Smx7^ڰfBLbZ)Nt܆fng[:(l͋i)}k (g;f>L`šG,t&Kߑju66&GI ! F)A ю]iͲ%Kf:e3%9]0dtkn|*1m+B}>6yoWyw܆ |06 1?qw:'8`@mfx6cDvv$]G#uĐDqL\\r GTڤX̳BhʥMlnD KiB] n ^랞R>̀蒷eƪo;Ϙ}o/^^Nߋn-vkȻ}߆6:lن0P۟ͼ6Y#g];Fizv$]Gi^Y¨UrQj]Y]]'XZ^dyy c Doue,v &Gn IDATߢ* QL_K1;.3F )nu]8([hw .~ Z {m\gI7p'y= m5># (/Q9<6e7F12A7oB%lJn={qrBx]XزK˔=g΀TkLwEm:3̀@mu(?01As@yfu:ƻqbNzpG1;Kr6"}ml潶0yL=$mw[6(sKJj:#)4U:`iΞ:Oq#GVejj(^ZNw}&&B8iyܝ\й=YZ|Ly(oxvˣ37H>Xgp ͘iC>6|6|+>+/&v]`rQry}?]kmm]L5~(6>ð;jAچͼv&X@_RzuaXvwobJMrJ:(jHCq~Gbcpq`n *wYR3O>1ɇp;wʺwA"A(k{;_]ݶWgt6we3V۬w'>dٝmLm9j^rUg1Qv]Oa$I踁0 hcAD28{LcʕK()Bu\BC}!X@r 9iUcX@`0qmUA*r߰wzV%dGJ1$ DGkH75`Y[_`uh8$ܜy bX.{?;I#35'WE!k$!ZL&q\u☑Q6-bX,.  RAn*kxJڰəgX]]Al MX,b!QE1aڠ㘕Fi庄Fk  hP3buhX,b^G)tk`4A\!T.D#GpkǡX,02R/B'_jMS=^<_*Osϻ\;yx':w: qk徦rk0 8F9.qK o+< sqVIXZ,E021={[&"G3GGǘ+V#=G§?h! Fcdtt_`nyk{ $d q<)R)Id>Ʉd*MPhʹ 0RR*#cbܷ,.,R =h@wE8U6wVGQ+H=q$S\G:rG!H%kUx<ߧVd2;ÇɓTUtf5hXk; d3)V+‘[WƌOIzDZPf1`qy|q__ H1VEM0qr(>qmu~Zɥ 5r䎮cˣ3hmp=B:}[,I bAG1 D*ٳ  * K>}jBVMa˕[,:*PSWx;8Z /% MxO^o^9?vl.G2x7ɦx_lmmv]ݜcp9\t}:4Q1DbJ171u}V^]ͷOnfd7_@kOzı&B~L#BF!Er_z>G9⻒եy W6A:;ʉ'NwzWͫ)dyW\v 3x8{&3{'Ϝcic>|k7M`fNj}Ԩ5{;X,݌3B q\!c :8 mbX,{ꍀ0(!&#EoqVkFVbX,{m0ިhԉFF#G<("6qI`UhX,b|84$ |WѨŌB@()j:FEAbX,=" "봊/8JE*K$A5}bVbX,{8X H1Da0B:!Z.G<3>ՠbg\Օ'T,B LN$ 8]G&;x<lc1Θ &0+@PjeVsx~? Ƙh{܈{=NUS:^K!İPAc}#D 5CCY0N$9RCT``hB!Ys9  M0IJlJEhKei1xOo~|ߗW!B kQPSP>i!ƀ(ή !Ba͍Y2 } , 7`SilKa[n,ˡd&"JaٶP!B kDښZ߇(uaCDnNz{(yn<θ㩩cA!B1y(ZkbCXdhh0 ZaQ(Ўڔb_\EBb(B!Q#-`庻BB8v{;/ul˖ !BaxBHFh"C,ƲbQ`+W,a)ňZ*B! "m!A`Yu57˶Ю# 硍BGIB!0nLqplK+|DoO^] ¶5T? K B!0:1ab'iBG[ 7PA !BaA,B[mlMvEELclK"(B!~tD2IT׍ D! l+B!b>W,Lck0|! |tnP#I)iC$1B!Ø5UU05ad=x;m E H B!0 ?TT8_e(<⎋a䣕"ԊT"P|@) !B̀Wpc.a4dŽma1T"  !Ba- KOm뢕ˡ *^4B!Ùe)Rb(Q"w1ao ʄع|(M<'c0m$B!bb<&}`ΜYߎ.|AUe3gΠ.:vIB!eAH8K<>SYTVW0~$a&B!Û4"t\ȳKcvnR ˵dsihZX!B kxH$QCE,!]; A]]({$B!bXS4m9ضMEDa!Tm t%,-eɄRT!İEQ$=I'D~ll!I{؎-49Jxؖ%b8mD"!b S~8KB!B _aE1 "  !0!Ƅ={)X&NQ[W1aKB!İf!_( E` Zi`i:Jsm ʠBiB!ÛeY Ӻ.Ɣg- 6 ;Ah"::Q B!ql0E 4ƔOʊJ&2&g1O& !B)/VdҤI*+*pDZQJ})\?b`p-rP!B kaQ(d1QH.%}8n*F -bҚPݻں: !Ba̘rY=˱)hm;h[b>a׋1F"(B!5RXEaHry0 ǶP \ ۲["(B!5uPM(@F8R*c`!2! 2A!B 7nZ`P c hK-Bk4v%c4a(B!ZX뺠Z2JJit((HgҤ2)(B[DP!B kZkswUyjU;;&+yh@P!B ca@rSgF!} 14e" B!9eʣ Ld8r9 p.T (/m3ZX8{TVVTUVe( !x1Ơ) K!bDt#úWۋVL*MIb(eY|̞=ŋSQQmarG]wEggL!,(T&_ol`n66ڶR24cǏcmE!ǔRTVVrI'qI'~C2򑏐f)>ak.IB sETbaHmm-D@ؙL~PP;bdYiKf!N=R&Lyr=}9n);\@ yg ۶MD"wo ~ݷ8'7^̛N8D5ȵؙLXVs x/ |d굢-:wBl\xٵe!SH8F(Cp :Vud -?$nr%;v5gO3O|?R=@9K+@0+2jaF`,XxY1sL =oO6n!gSf'ؾ.h޺_I}PÈQ8sW9 ;Yg6QF!JABQJv^ecYT*]Bt0dٲe~ rypB멮~G#("oI,MښO$^-szE>pG.ySشv5-mj3M(Kl3Gy~sxy\f:ɧɦO[ʾ^yCCC9+6c7U*җ3l,73L+lڰcO;)5%z\dp'ţKWױw&2 RCCZ) o_=BX\ 8sD2F^!0+a"e_5JAEu5E#)1Jv!,YyGMM͟T-!"Z[[ۃ <ƥ6ZN=ٍTI gk|;z,%uQ3&bz\y8sY~#A%b w;<#98T$†u9C=g*;7mdQxi\r?0/nqǞz׮&&AŔJVNu;yiv^~:}lAeϭg켆ᅩx uQH+}. ~KZ4LZk0$_c4Rc,a⠹ yn:;;Yd _|1RoݏyǙu }u&(5PNi\E/60a4`xvmȓ?Fiҋuw\~XF448R_/Aɓ7Ż$+Xrgsurܙ]9 Y!Ӧe߲Jh*&:p#7x#__Ţ۹W6,Rq8q,"20Ty `0 ;$Bchoo箻+/uaȊ+Gss;=rrlcxblc W}!GrѴY~x/~6G^C" Qe,_0K9yqw0m=o-\k۲|r?Caxy#_{,m4&ؽc{[;q{Aњ c>uپc7)w 9QU wlawKAxpGCN=Da@ 溸_,QeIx'Zk&NHX| bY{~=Qan&"Y*>$b([smZ8]] y؎܃XE;wq:#B!;E"rtZ3؛6mb`prE!HB!İXChAׯD&,7<~@PKh55K^!B1B)'Zk `(ں|.OUUPFtPB!ÞB1DaBa[k\/P7X̥Ts-J===Ȥ!B1(Br]˶Ba A۲-0`x"n 1 !BaH0*4J[ +,\EjjQLjB!Y,PEjQ念 QR*QRi!*B!vKk1` Ɣפ)eQ b硕BkH+B!3-,eUОEu,F)%B!Z"R8mXUNvc.e!`Y\P!B 72Bc(<v0r a?Jb{ !BaqVh |4G~A+VJQ*y,QȐT0~8B!ւ(`uc(P "ai {QttS][CFlI"(A$JqPUUs(KJ!ÚB!ZkA@;BHE:MX-lm38GLb(Aq." *++ab $b%B!#"}"cPJEz˶JEz!lp,['A²,>h***lNc޼y8^B1 C(:9ec6x 5uuKh(sDa 񁦵f̙,^˲XrLqB1(&0FaѶ>*(²,y D!,-<:|aqsǾZ[! /OFFX*a;CXж:h(1BPn9>m4>Of2+bx, Jc0忣]3 0rL2MT* Z@Iމ'r 7`aŊ !ˤ3\|˶1to/L@)RXM$BP.Qf!ʟ ǏSO6t+ׯ+qs^ּo=nӚ?.oS˱?Z+9@ds9,q\6(b[PSSMOODeae$bRL2uI<󴶶chii!Nf<]mr>vTCgo_W"N{k `s/GGW/w }_}W~HWVQNىoyxUzz:~8E*f3ؽe˖m~H1ftN9xFT CE^PRR[`Yi+NS'wnòKM7ҫ?'WeՊ?(`*'BL&3͂RaqahqqT>ٲp]Oچmۜq466JDI&1n8*++_gܸq̟?\.G[[[};M)&2(Æセ9W}9t8nrǟ~P͋/`lя?W։?|#{7}ytq#3?$k+'Θ@,bYtJ{ؼGnWOG"f̹hLӮcO_{0xǞٓٶy]}m,d fܾ} |:-=aJ}j!'Q € ,U? !v5<ߣT,{>P$cǎeرozhjjb͚5j/~xO0~:Seصi3t-qvED9ZLѶo7[$S?ckQ氹Gӿ'SKK3WaɴΎNLi־%=g6G%m{=qgJWvxZǙuL]2!{дlHŨ:d,m4Le:Fwm`0_DkSٚ.6/k8aX#vc`o7n%fɌ`8Nif=]*5$|d_q.>Xdɗ3Ro^l~<>s,>i<". ?&~i;c?}5~"=uDQuiTAo}|8l~bu_nl@Em#{wl+'ǭTcڲ1Zl#۱QJcT-K8chkkoY~8?TDcO<^0سԥض w][xjzZ.9}1*?!f<=N2?Hc8~DxU?}ZVvCu8Op I@Oߜv5gbIq'җ؅sٳ{E_|5{")?83?FjG!J[/~Ǝ#˰v|~u&:G!NsE ts>3}&Z>rڭhdN aDU?3X b- C q\, k D(x71gNџSCW~jTTT1jTL:X [w~DT\zq3_y=?w G7: -kзc]4\Ul^2d1c)G6A+.,>}N_Ugk^ʩg=WސmM/k]4~qϭz|RӗpG`OwIGџO?2Qk>/Ʉq㰕9>cY9Tn'\}9L͖| lʪ*$--ttc8 Qnp1'K 8hi:u*cƌy*HRt+^K aD:T$]̚66G\BZZۙ0c [^--_`]^ϻQGyk6m$]hLxej^@;W7iԤl~xynm*=fΚ YE!㩇.Xus"D)M*!0s\<[E|2hۻ{ kjO{o/QO@)?Ğ1@/F|M@7a&b_{3C!FU,a@[OAd S WӾG.w'}~]|^摟ΉBeiiv~]~|G,}vnD:/f1^ڂ1;K.qL>/pƒ'ظYf)W^<&ƿ^uw{:xFAz˗޼koigG~Zs9HX8>B|@)*T:eYdYJX, #ac ]]]d Yƶ, A."6nիє.L&LzߘZË#/`8أuWMT^+#aߚ+іM<J̙ڄǯ~ךQJLǠ\D,EP/0;۾2&NeQGE8ϱo:~ƷLsi2{k_nsཏp tc twW3vRg س/}fJ"幗7r'+,_(C7u[6iI{F;#<:旿z׽u]~yX1Tm=c5m``wxL>jFO9qSVE:?/%/>Ӗ\Kensg` OLy-]'.X|sneƜb@ULBӊ'PW^MM.ȶn۾KH]Xrlܾxs>|YMuܩA`æӶE\N>%{9fƌgg?As?v0q*GUw\0tޅ'ۿ?g.k>?hjǰK<*ެ]Ƙ S_"_1P5X,{eB|iQTnfYCd J+\'V +0X0 Q'J)M&_/xCgg'۷o-tttPSSQ0 yؼyj<+wvއt極/=Œ JݵlՊR.G;l2vmBvniص@gN ll˞gƍ۸`ۦz䚇~zVQau];$mC|xaȏ~_5ݜ-uev_y,0-k֋vn}b~f.tfݱ~k*gmx! qZCyb}ߎαhZn Ujg_W)gxS.3b# Øm+ǁG eZk *RJ&bdG16VjWA\SUE}qGO(RJ4Us%|1,#pwGsyqA=&KQRfR_Ou]cY߾g1bfnŚ 6ooqя~׿˿K~ʇV(R/Ĕ@1.HZq1!0z}ҚR-b__k_/ćx?i^R4c-}monH$V.IT$ڰ\Qkx- zhC(\ykUwI#~ 8bİjRu[2RJ)u҆oo1Q;.Z11x\4{!$#aG4RJ)N50 zfZҏW/qVXXx77<<])RJSm%I ݎ]\\pw=77vRJ):i9ZK ,I,ꚦqZbs11i *RJx]]QU4]Ge ~$ATJ)R ϱΑqw[nǁv1wþݥA)RJ6k+o,H"2.FO]Wcr")FݘL)RJaq>{~yG '̢m8[1k+vճkmARJ)uҚw=V%Z"@Hh[=1Fb '1h *RJne6X{[{RًwnLRJ)N~+Dy ?x"HJc 9b x}RJ):qSmI1-ݰ\.1bXs1֐nIRJ)N&'kG%ϟ?DGq1Q8Wi *RJf1aI1ǂg|!a$DA[P)RJ4C:v"UUgGܛ/P(G5(u Bt>[S6R'zub Z<`p0`0k,5V[PT6RJ)5u8*W6v$K\,ɏT˅1%],RJ)I!`cDax5'nm)?DjRJ)WU g770:q~ !#ZԠRJ)N:u,!FL H1ݖXs0F k,C'RJ))sUFbc!bY4Zmj *RJ1C}CHnBU<"www {I)RJ6EXa#n$Rij8^[P)RJ4 H8g1bI1PU#)F\Ja6TJ)R'ZTm/=wwy?)Dc'J)RUᚆ#޼%1y/ޔ gϟI1rA]RJ)uU 8b 0VdWU1lJ)RJ0I0#Ga DuU>~njarggguCZ/RJ)J)Ѷ-1|_Z TMepu]Ӷ-q-{vy{mCRJ)uDcÀIT1 c/-&n:Leba>CDO)RJ6k ]Ljn{mZH~jW/ ]-RJ)NZ$cDDTXXW~Ӵ-͆ݝRJ):iB!@TuM ƅꊅmqUE ;?~TJ)R'-HJ k bKb|vG @۴RJ)Im !0 on'u!H{b^-RJ)N[ڶe݁>ǀǑr8q$xOLQ[P)RJ"$b$?Dq$H<>\KUUw5RJ)u҂@eZB {gj[3e+2BZҠRJ)N:1TuEm1{R zRk hRJ)N[I@6@ďF$  @LDiJ)R1 D"ń fb.6&ׯRJ)IC+x?cD,Um{$%DDȻwRJ)I ƀ R k-s#łmv޴RJ)N>* PU5^ b@c]<k ͆c*RJ)u n>'Ip!xw;1kRj*RJVm4킿q:5c,fqI!2t{D:RJ)N\JϿ^z<$3 =]ABR3#')RJf__A'Hqc\1RLRJ)I[-fOq@"b ƀ]ADzۚRJ):enO1~pjHBLIz:`ݥA)RJ~dh *RJv~vH[bʻ3@]q1&GbqdJ)Rzvwqd.+ 6?Zxs7HxRJ)Ix5uж-1 "U2 1&RUJ)R'z?o߿ɛbeއv!@L)RJu@7@mX+H`^="BH"8 RJ)Nf:c"bĥx-&цb,;7(RJ)ub t}H-Dc=N >54mGRJ) S; ~i]E>KЃCc*RJ `c,s@I Ebq2vmCRJ)uRJV} ~A,7/^ryy 8z*RJǑb,kI??ĊHuRJ):y]GWՄ1 :\]]qqy-RJ)N 0~60Fc_R8ݿWa?T[Q)RJ,ӬIb1K=/U]#"y"!9;XvK1R"Db,0TJ)R'-HJ Џ#1%FAv`ꪢ]TudJ)R%?zU]SUu~ZYp8 8jW)RJ>aXAvx*∍#펔Fm?RJ)us 1!m`"8=!$J65.%5RJ)u[9k8'k &䧫 s\\\\,RJ)I)iږ~1GO]Xcc$*>|-RJ)NTJ)R'͇m c1, D#IIInORJ)I)cX Fw c=$U6 C1{mARJ)uTaU IDATې#r3BWK䌶RJ):m)ocF0֐$Hub FȼQRJ)R'ISUTUE$oO&f!E7MSkڦ%Fni mHRJ)ulpqy@UU$C"wئԎ$109bA)RJd}F7 bĤGcaZKk-͢sg͇[~ R5F ;)%1#D~\qJ?_Gʿ|?}HN<=)zG}E OB>\cOO)}k}]Hn兌1Q\>UgMD||km^zW:sk!O#“=|ze>`?~)'+@h:'Yc~Z1xGm$c )Eb|z̜s#,H#=X1fnأs55W̯w9uɉ6}')KOoD0"_[b̟3OF/"W9B:7\R9g""R~fLzW;_5S?|~3bBL$8sܖRnT6~k<}m|r ɚ>Ow20s)1I+}1&_OoE>Fb̓cAʉ)#m:__$k\LXO̿Z_w} _ fMO~Y 0vLa<闑o:&QݣO1WiX] - >P8vQ} xO{Yy@Qk\~'b#๾b^}+AρY頓@'c닍b:\! &F`%@c,ιyМ~?HUG_~_'wS$Ę?tG] Rb1UEcsnn?Νpں !$plq H 2?c,qCeP!?oͿc+g-NU]mGc"hV+VwY9;q W׌Ø2(:||Siǘ;|v6?k>@ }O[7UEuㆻ[%uU? g_w7 g߼,UԜwa[}g{Rx}⩔'%991Uճgm;1$`Zf9 0# <2`)m[0~c1_d4]B t481r<є9ň{8\.ic,| [o~!o B;MC~V| b}vC8vGs,a~N%!xhr&'ke }]*יxL`삺1bnw4MC]7 ~g۰\.fqI*GQc)s]ל_\pv~CODcGŠDBl>Ԕv\R|nPKvNSicaPEJ I6VMmrߙu\Պ> ?O@ 3ڦarwG? 9p[9.XƀƼ:k1DYJc0=wwMݎ~G*j{rC }u\idh1s'Xr_<7b8wH1C_Qk!C_BH~ Pz)#2xU@-Yڔr~uX~8ICk ޿'o bX 't@*1['0>?Ř3VU>SY.rQl|N) ۧȶӬ<;;cIDڶ熊)!RC'3Ngs6e3TJ`SʵB2@`a$XVJ[aqup;K.x%vK0 c^#> 1r0p{srxoooX,?`{a`\Qy8W͝vǏ$I\]^+1<<<`R$pM]<)R/ybqJδ _aM]E Ͳ‡OK3sh5C2)mS;esa%O.ci$%%3{w MMX>;}#I @c Agϟss~v:uu[$c9vxv{s1vygX[u#vA y"@8@YxnOAYs}cJ""ve4Z|69B.OK77PV;LUDSV0rvG48cHIKΠ`@湘vcii^љuk?O,+LeY,W, 6-~Kh(};vk M*/~ ekGnonqXlk.iK8gSLcJ!h!lXc@[Y-c߱x9|ykpr҈*1X uUͫNSCW 4"ƝIO82>y<~ >D4qt6&q:?/"D9Js+4n^ !+U] 7OVb,c_,\x 5?tkPM[fSρVSTBȓNSΪX,{.W++(Ib^#b\y,69IN S2@Ucs:87..k!hsR)尿)*Ĕ3uUѶ 1MK~ &k-<뛂ƪt H oaX[2s~@˄&al6oKXW<>ns=l}Fs{?Ęc?E*<~#v{ֱJF4t.ZqvvN]U}#RJkR9lڦU:i3 /)cHJf#s'XS1wTQVgĔ씕3 Fv%#&8q\#~gҗMfc,wvn!3֫ռa|=3F"屯U'y'F愓?})7e?d$bJ9s]55eT(c|(:\\hK)Y]F?Kй2nO}gggy1w &gkÕc)~2,eV<- MAlUVL ,k b+Դ\_'1&ϲP4|M+r dP`Gϥ2ưh%חWW+jW,˙Pn^X|}Gm6y90QO1pqq<]Q@jj?^J%{9UU7l6G]`9;R. ^-/ݗomxm+U5עNA)|:L|uMa)}Ĕ} %#l+='&y zNe9KS_2MLKӦLlY=C/q\*{0ZX UUQ&)e Al6點"ch .ιˎ!j01fX2nF+y q9keZ xY>lϦ,\<ߥ/ ӄ|1\_]w=@2ljeuncJA*`O(qe|\4$)v@r )q'!ҧ|B)!!B|BgJ4PPa>yZ!S}'ʫܷɨܖj**qҿwYi&hZ319b3g#>T$=%(\7Ir,j)%!/#@wMx%LtH87'6םJ>8 R2NDIlwroO7J$b M][akP\?eVR}8BIrtqyYfc9YUnSDLAՔP]לzP̵t9F•dO˷80 ̳iQWx񂻻&R^`ˤ2,˩SdŹz>'ڬi9i,ŢeX쟔=]dR)Y'ˑ<%"2ZkJ9[C nu֖vyqI4!ưJMU4CqCS292ly=wwCɓ溦ʙJX,i?D64m'cY<3Onzk!s Gٗ\U2e M|-RoZ)/^k|6nʜPV}`{ݞ)ͫI9#]JJMs|ޏ%@+}yHN1w2(]DԑO+kӍr7wÙ㛚K3BL|8,Ojc,"LJh ga=4v>q6$b) }LqNTMJu'Dբ/_P[7< a)?s6̋CʾdiʯzsαZ,|v8+gw\,.ɗ✱<^z9}csr'5m\Hn=s-]y `䪊矗s{iq̐ȃŴ=mcWW4M0e( 9%`y!gQ:۩L'a [<>|nrb^qj̴u͢iؗei[яs;ƘY{\9aIP{t1%inp;Hʁou!wceZ} >|8ޖ`b{SS<)!?=#%HYv6qTrI븽yq e:R&6%-xvן} ߿ܴ)%aTeEd@>e!Dg\_]Xky9[7-墔%Er@[k me5,f^7mrHaY,pя#KʊWySLOKM<3MveiNsRD(qqsf_+ťln {5 ]ZJc(]+On;-r9F?ܣw&ri-tS49̫1DϨ}'ڒvݐs=s>o9dKJkͥ%4>הUarebl}>ϧDٟJݬe6H'0I(g)Io203#X瀟__ A^LIDAT5IENDB`onionshare-0.9.2/screenshots/server.png000066400000000000000000001770511301215300200202410ustar00rootroot00000000000000PNG  IHDRTh*cbKGD pHYs  tIME %?^ IDATxyeY]]kgs9w5U 44@mTLh^|$&y8`kE > flzꩪn՝=ה?~>sO}Y{ k8;keY"*(kRB C@ 0ֲkHѣǹ۽>V UV Lih4IDVIJkNC}^G'EEg{r,×g3 qt4|F+s<? 12$2,.qs>@it-4Geu<JxǸ꫙v8Ü=(SH=p3g!Ü},tD4Vdkc*/ d;:3S;lolN SÌ̙ϸk,}p13;K" I4M! y TQh&8!(T4A4$aan)z-<_? ss3<97bKA$"iҚЏ mKeQ#ƪ pΣR0*c߾yVWFH!Isag-X Q OpHjQb-іnCwjյ TY"# pXZrF 2$I8x0:Mhl6Lw:d~8 ^X$ C!B-)-ySi%)ɋ( Y"E kY|)8q/O}IXqeuu~#A@+(]ш""+w`/]Hhc4>dŘpm3{>u;y W 8qr:~QyQ`a!T*^30t}_~.kexR"@W}{giqsO#=G%81"RZ&>t$iQ13;Gh`+NŽ"/0΁u8kp>EQ2 UUxB`%$.aaY>qa! \8L{PUŅȲ56pqF#N?t ADkWR$ !X6H!@Ҋp 78˸<ɰ?ZGQThpX",zYAH:"bZITC X;ϣCkp! p0,K>}/! C6E|n0 ߇A@gRxh8눢,)5>4E[ _".IDZDO[;D+Mh2j%r67Up #esGG,,,2J3tg4[mJX" 6y!ۙg\u(X]]̙XPJ3=3ˑY__E- i$M<'"p eATZuE!Rbaa<"?j[&+(ޠV#A%H5UUXPeN#č{a)C8ff~f BY15աK) FcǨʊ<=VFikS' tLw;8q9J)0D 6v )IV#c_Xj233 _<2D IZffp4b{km1L[DqDe`;sS%B `8`ee={rQ._%MS5,籾O9va{sѕ&e{=h% k\}5 =VvPUAZh48|0;[XkԓL(Q TU*I֊fI##.\@x6G#X003aii,Bf3BaH*/X\܃i#Dk5fŞ3+$q 0DH(1iQjI<_a~Ν]F {xOfll˺ c ql;\ ւma-De ajM|f+! =.{es}sW#tq X;i1PJ*$eUb|<)`-eAHդL1$,3z48ᣬS}QYQUZMN~-"Bڭ65q>Rdip4&`6,rҼdߧ?%24!||?(+,:[?gZk؈c-i>BJg:\sO=R j`4tOJua+8=$NjQP+WgUi!J+8" <* s NUi<FL7w'$if9;$N{>AF'#IҞ颴ػa2R[*mqA IEQ#]( )IҤۙ+p)Q!},Měwv'jqm5BH4I+ xAFZg,RH,泔%=A=+/(R6/`U3a4ճ',vjA/8+ غXbt6eYgeUQ%J>0 8,7=&|ߣ,reUNG+:.'ǤiCPj'A2OlbLLIITXSz}D!$YVkhRLY8MYY_#7*D @V!0(}i&(˒5VWY_ Ksuhek3ԾvS FAԖ!cVy<*8<2"b8j߭Vh4EV3H)' 'iyǨ*E!EsZDP2qȱ jĬZL7[TiNYTcRfI1R(eØ8Y]]A0J8xit5g~f)r4LOwt:Y+}`yZCčW5qL./z p)Q ң*Jʲcy1t_l|kvc5XS _Z4Y58[k)jsGQ]m)<k,A!XChc#1F)DAu@D<)k*6F!%9C:*y^X qBa #J B(XpRL8'AH@[]3ckMh`s{ӌNVWkC056,qhUҝ갵7N)e\jtsɳ,01Z)K C~GI'%!2( i&I&JUHL+N5"z(D[ynh C;{R݀ˍ7tg^`8d8HQ[\`DQLXKLweUksJz>AUE5E= Чnq1e67ѻAg,Y+ B[T͵]u66 FxRTe$n1){A=vvfs}LMO]X 3Su\k|c߾*I,AFBc<j%dt4FZkF΁ 遐Xk(c5Vk)6ѶQ@fä!eߗXS`QF6{q>pD}{XlmTe/ & < 5`WUat'Np`771z7cL-|u J Mv6"gZUI8U2oǎBhتL**3M8 a (U8)T_:77qGΙ]˂<3L=6V*Vj*q%/VSz0X}A3pNŘ U8c* Qy3%InavЗ!8S|LQ9H1dcY*0DZS, +a+[U%u!ʱUxg<죊 bT^סʑѝj|arLUuQ:D;;LUPd#"#RI"cMIHѐ2ˈ,SJxұ`g6UbbcuaRnE'p8'E6$$Qȅ3hHG}@23ݮǸ.QUN¨0fbL#d4;M>aC.\u+f:M6V:S x0 >JkReY]+vJўy^JLU2Ռ۾g^w5(f„ ;dFA{kTS(viQjOa%W_~W?=Kf„ !`7W~]P'P}^D8Q i7(&.-> &L{snW}[)EfRUdE |nD9/__se&L0T{𜥨~G i|Q>8GJ!=<铎:rI0Ҧ1#|o})/R^yO 6͈"iQڊwoOTg$"$/~!C-cʊ ^DŽqBhk ~[)0P QBU՗6G|ωE nu Qdgi{5S"x>t1z+o*O|ǖW˜u C1=О UW z*9ihW>;3=ݻ^KozR-ރyIGvYNb'ZV׹!%r5ZCn?is84jN@W#u+&=`y]x q 7}%6Oz醼=W2in_]Eݭ=a?qTCbI=-@ЧPF6𮏑z8 bu2N?i1ޅiy&'[=Eٿ;'-㓣{8 wqXӟ?{#W]HV'o+ۺqx*3>;x{͕'#f7=c4Wt=qgk mΞ=0IGcbcmpxwCs/ozpk+|ϝۻ@:&>~@m򖷼Bb9o{w6"q߇sNs}Kx˾v4u8)1TZ-MB){Om(sHSa%@+zMScewR`,#Jh e<.n<1YR,>[Q16DA7;88N?x%Is{sx^Mל™_}\:_m̴|~嵿}o:-|o=~ѣǸ2X5\[_COva;]9yRvLJTEʧ>A͞tuQþ-؇xswQC|^ IDAT1+f8y.! pMVֈÐO^~_ |ѤER d"O:|ZgF?_/lW^ ?~'wřO{ͩEuPN<pg>_R}"➻?h8O}MzU m5MQ2k*d} yN~'>6)f 4lz>idϣ/_xMiYZOel/|?xOE"**}9ŠZCH6Pīgoj25s>A>S&n{˘>lsso"ˎif^ƕW^l|}`h}/ͱr1=dsuOy}_p|7VYɓLO5QbeK9yIΟ}w=,o8v}X4eAC+ۤ3r}cb"C<7D~EFSB;Gn.ThDx8~ZzmyZqbœ_Z:asofmEQL&T+UaM}N{| }T= .C1F>-( fD}'L0a4+ȳ-,=*r@+ LwPe97^?i &L폐 <!E"I;~H}*m$_W?a„ XXX$'=^vg^E#((uʢIM0a$IV!L0>a_)h c}NIM0a6{,Y&,9Μ=sk(F#tYa3$ &<$Ie+O$lm#xo*dq!;ۛ IM0apV0k¨MTYӳH:ʪ2;7C}Ʉ &LxسgqB;F)jL[d|yjX|K+go&Lwc e렟F$>4Jln812;7`*K<)}1~IONB TшrͅxGt]$06a„:4;(miuI'+8s,6c44bUvvN}<uvvK~G)Ee9s9fgg &[`'L *VK)HSӧ@ k5|)ɲ+&L1y4eYbm}Fټ³,KVWW1077GNqM0o O&/3_@Q8VWaQhpKV%ZB+^fcZ>Bݓ+~yfssY8 &҈BrKMVw$.~Q), r!%Z;%Gba)wѨ⪔ZKhBv)-&Bu„ c_$q_A) Y!fGX@[ |JU_H)R#s^tA@ѸdommQX &-~k/FЈt~PI&R:AA@պVU)vvvX__gϞ= VbCJr2 p"kklom#Q|jB%iQxGxGUUϙ3gpEJ)<8&Lԩ,/Xg ! }=HUG+iREV}L[kQJ!D1eZeYjhh/ʲd0),,, &|1, e(SEllbafn*3' ihU2B*uQ3? KA+EQBqsy|'2M1S#WBٖ3Oل/;w23Qj'- aiiRUUIaii$ v]6QVo@ҙaqi΀"KsݿT8wIh>8GqߛX)[0*8$N"x{}O@(vB叺*Rϵ^2}ߧ,K1qLE,,,HӔ$I@Fkoɿ@ \kO Мw]\odߔ3WK?{GcʊWjgF.Gf.KC|? xsWMftx?!^r 6/a8n`ٝ;r9{b7?z&"ur1#gjz<!}@8!eUD!a菏{G?aH "Z-fggczz v"^XjaY:b?D/l6Ӫdg{x~;YX!9CU}!h {Jp@?@NJ*5{C[x7<8G>ӣT_ @ˠp>"C򆹵׽ǶƵ(/Sͳ1Olò7pp?ȸ>o~+x ~gxm=Y~gr7рW~'=~'^qNx/wFW_;w|Ë30o! beXMF1VUiFDLƙKL}u}5Q)%A\|qE`0 c%vxO;?~>l˸?/~b~^96LuO<_7I?™kŽzOG{-Sbs(wI?/F>ti߷~5c!._>?zrs'[gmj>{it~go|1kU:S?5\oܳѢv+s|?8ɯlx/5G^q&` /}1ҴG>s\ud~g/b`_ȉi%K3}m?Ygv0o|B>g׽g]yޟYz:~%/fJA>>_5Dw|~nz2'P%kیӌ~~?h0 h[H!":ӳ8t?BU)J5Mx0u! s(65MK'K?HL `㵿N_ o;NV>#6[ݯ/87~S.~Crh鯮R;W>v2Nqyp<Ʒ񪗽`G>wӟG^|C<;I+6VS8?_Q.l. ~7̿Qn>}lVnIdٲ%[܀`I(B^ $%$}_H C )Eeٝ>O3Zႍ,6돽ޙ癹wsι-)X݇ch|/}5Wl}ldEYnyÍa5Ţȟ˧?>^ޏ9usJێS-1U 8~>󞷾?oM>z*GTE[s=[@}F\P]׉p)%ry675L&g>S&H캀4,K|3?|oFLBӈz(B7 BI)!E&QꅤS:Rn[HcX~ eiέA׶c%E܊!2ͽaFH a|KZ䳴+9a255E[[J=iڬA;#Bltjj'(1b~KW/A5NrҶdq ^q+YV܍faKI&l,'پ}M׽Kӑ56ӷ| 7\ud 8x|=~.߰ZygEWՖa^.&6sE[{ X+^"i~xY*9',Lݼūn˝d׬!.JΥyFP3kVWY؞k^S'N7׼d#Mf4on#+ym4g?{r$} #Ftf֭mw1&J&o{;pY/s ZiG8y .{}yDG6t/H+Ew*"e=)y˭!8#4ARGֆX* !ARH!2donJno!e= lzL;q\?dl𙞚X6X[-SzdYt!T?ncLwTߌy0ͺē/v]Y_T:8CNAͤ VmH!E&$wEPK3f LAia.vf3*~!J\%NK)&0&L ;>bNRQԛj _Z|~6Z"ҙ|ә-3f*Va96n # #LO(U #jV>lC(g~RY74٘ilVY  Ne8ybÇ(8!4  ?285Se*, s&&shZMOɈX"&!/@H =XrbƩ$ 0-.P(U;д8x`txa;H S |FG[fgFX\=p=^ |Qb1~S+lN6eJP ųJWw7SJ"A6b^ ۱| p.^T쟱&;;;fO9eY9 Bl#& &2 >! ]È0 0 ]V5MömlV3P(e*2T뒟$}&KhT]XĐ(OP(RVhfO*#ؘa8/t!C +wZP(ΦR*R)GT1K'hb*7I5K܎c `1 jH)`d[ JNE  €Oc,b(QU(qۚ8183uukA20Z(J5 ,niI-BnOfXeHY Q}提!RHL!t])G B8=pCC2f>FFt$BdMnJ)du4Y)D" ]RSQYWzo' h#h‹q5 R"#2MMq'4t#75] *@t A4DcP#F 4т.MۮA@ֻBCP1[*PZDWJ <#(* ϣIW !0laRπ6UBr:39&U5jDuU0D:m#acDRͮP(2i066]s!2+`he -d 8_9wE &&F]#H(:#4bZwaj0*̈́{OQm~K?=l^>sL"Y|cS,m))'޻/p /gQOAUٷQv8LۼelڸY=G9gnf}I'OF!a&zðdґ Ȧ76׮dνO55A"fSg71 _Fυ0B3(*;ij, 0mqhik%JDL컯[4!Х@ R 5 ,Mԋ]KB`PD ^؊o+y!* H{a8o ]4_~&S[xG>α\@2ՄxӼʫx>>;kyǾFyRWBH!'b3Y4Dh:K!1](s")1{b" 60ZcdF0& >H c9;Kٺm>6k.k/ $β,Y>cRO;sѢNNv.r^c&+#Cr<6_ƭ_jresDz/dž>? w/?#⡝y?_}~n&n57,_S+wt}=]gx4f.پ';vh|b,+/ZM_G!&]Oq>ۿ7 i ?R q%RD\,{>T |<ϧZsD"iYT*s>BM[ZZ4@V&՟Z9Mhz=+3.&0Pp>ܵO4w'3VؘNՙP!X!zp;X#7o%奋/o{#QɝdZ;xX] :5Idg6c̸D̋B==LY0" hyS=_!{lO:$fzp_W|QDOɠ?.kxAXFNatn6OpM\_$jiOמyV6o9=]>?^p7q>}c5›>(Ci<!+/x i q80[ZƯř΍c %l=(B `hD"];fFCu ^CD&F ֐_=Δ?$]&>㥿)>/?߼󏿊'm|o]|Ɂ}aޕg,Q#iS@O-:p024¼~nбbIw^;l|F9B 4o9*w'Z|ͫ?玓_O|aNGGQDjL] qMV;S)J9|49:OF9K<>i]55|R sFt[s*ɋՀ9V*d2YLMoo坿q3mFġ ɿ|c#_{+y5D.^?#ﳮm\k) Fo[H9!%KӇS,H4iMoGY㻷9m??\Ķo%g>.D֏~6Ĉ6ofӢ/fn~rN%Lb:tAhTeMwJȁy}x*w'3o)mimAQD:4,d$1 ZHA$%^ɮ Ro'=x5 4giWS?saȶ2"auR/רfCZ1fj4U zұEW|V_l3t\^vpײy5W\FoO;}KYv  א%XկpeKmoےsn*.u+W ;%]L6ax1][`&뮹?_!ҵK/^MoQ@k 7غxF2¾tqkyٍ/ v]]ĪKItul~tn%\[]M$OL"ݩw~x*!ZC<0-ĥo_TQۢ:Ϳ|Oz\Ma=(sVb<~(t۪[sPǽ ̉js⭢cEHOxs%Mω|=.Uk>h#Gk%Ղɿy0ͺē{yG998Rvl4]DôlN0xu)tf Y6 4fWEÐ5o95E})sTkXuƚ3Z1Idy߄|XwZUKhEfr9&3I6) Jy \N>L 8K(=6~qCHha4SSySL' lX¨ e]yhа\v U@#($fF % %e>awl l Ĩg|l MHv0[~MX;1T=5R"6[_FJRz1/!ShBi*kKV(_O2$B lkc1Z_5\b11Vuu]=aEsX,F2Pť GʨjfA}]Hqˤ\*R*9v8"rBbe1+ )O4@>nb&b# ҩ$m- >Hw&}gP ⅁n \Q" %71yӠVRP(s0M/B79JQ.p,ZD2I2 tULRP(mc::ic6R,Hca!ibͤiNϩS(.^/Ty L$tX|)9V=BɩBQBP! C<7t<ɲKH*߿/ر`6a( \Dah]'LzUwbqb**[C pURP(b1=9e^'`ْEtaeLIJ,0湸W) Zx}^e,];v^oQH C( P% b.qbzM4 n-PaKHRV+$qje* \4°l 0 pjp1 Il4tD$.RP(bvl z>5!!%-MK\u]bvLBPA4i8l+5(}ME"& LCY B1rD"Zu1uXIх1uP(_"}u3M*54i211T.aK@(AʐS~-MbpQ(?h- 'GFu cM$wI'=xҒ\Б#JP<Ѕ=ujRITF IqQLSj$qR S:c?7%;TP(^abDQ&u8ZcphMaȃoìWRQ-P ,/O.7A{G'aիM09ֈ?0Q L B1y]q(`pp 0M !A MhDC,0L5z B1N$`X&mkQ\#Ja[ijS Bq0ljAqI 0,8j$ ,$L5z B1 QMt:WA[WF*T`&R)G=B["#ƍc}dY`Ǝ{p k40tlIBPELRTHSIڊIiZh$ # V) 4]]@ N[VkH)1jcqǦT,{.=BA5 j 0Z)ɨ߿!$[R)5 CDZm5z B1.P*|MhB-[f!bseJP(3L榱i(ba`ӟ`B.B4A U(BM'}lF"lD2AT\v QrQ&'s~H=sO3!5/gq^ Jj.c04MbRò-lS{FQ/yh }QԼy5/ϝy4xm;$"@Ri;w5D2A" m0 1 ۶(E?-Q;/ew39/n70 u۶ռT!O︓( F>Gx]lF_G2n=oqKעig -w[t9w#G/gMN~cS_:;]še}" 357~vښUo+7g#=k:s<5ʁcgnaRi`޼nlGrn®aM/𜝗c4LS+=ݝ8֓w9ը+jkJn~f:=w}7l24rc#ODv:[#Da$ãxaDsk'mM&M9R~5LS3]?~IgS*ejJK{+dkOOWc##LOW 35N5[hN%_(kI3t|/?sٶv &ƆΫN][vچډnB }& O8mOeS<xًG?~.m`/IRf'F{BVm'pԦ; 4ٱ{Wn3en4?@APpi݉S,hx2C&4~yWkGtaJ£[X ŹT z]ר@"DՄU9QiPh MkB'`d=zrQ**-v|%J;Z@BXb)NQq/Drca"(V=1@Z}._wZz|Jln Wђi%D![h94s'wr `q* =o!;ۀ."ww ^@R[(5N$_#,Kc$y¡ĤQ|5"À/i2M@4WJzt!8KWf"D`:#' ǏLg:nܵx# aZ@e@:skH8&N !ܛTY^;4B`ϯ8u d4 X2Xd1{~ϣ'qѾl׭ˆ#99Ig{c^hBgq[^پȉfWm`Y:322F3 ¨~6QFiwV;̪j勺ϝg;XQcOh%j,FƒGE4V. i (4frgnw@P3psgktz=ײmopmLdebБ-XǹάA˩iDb־axLlou{)c]$gpoeDx_X OMM WAH5,Ȋ*$ $Յ($ ';R,P-~EIB<;߿7I@d!",~:P+eH=n.}^DQ?ͥ-I{8škе4t2$Q@PZVa_o$h9VkF(;C24mŲP<5B!"0 a({)*Gt{\S)alm @LKiD"gdt]'stǼXE4EuGu}E3;ht: K{{;px"AMM Æ %#iT9nCe" 0¤J:ѱ zq=/T&ewv˵T˲hmmu^vQ;x}za[6WBKIA2D,4lONvMF\NCHAy΋r9@+6ɬٸ)ѳ dެ 6.YFe‘f~c߀봵G0 +DQ=^$ dǃe^L]ivYM=((L0m۶"DآHaI ,DIv e6,e0uȑhd"aZbqӄeBuppp`gilP[M3e1ItdQ(P'R_pvCQF&vrHm"1t8îXR $ˍiX(.ѴL^x Q1MT*d89888|Ym A=4tlڙ}(ʲ@KKxTPT'+; .TUV<@-ll L%v,T]LլrPelniڎv@欕+6n Rt˶/D`ڄH(;,@i#" p;r2FlDA@U\nŅ9spppq-MKc)@xn,LL@x}nGz m:m$ B> etC(**$rఛol$zQdBv) $b&K.%N*r (xP\*e6,!2(dJ% 4]òln#=]-T&k|>tC0-LKг,dIE H(NL]1-t: HBeZ DXa7%"m#6r$L$IDeI$;;h{#<]EY Ȓ9j BGO7mH&1 -XDuŅHS(H$bh]-Ӣm;j~=h h D\YM;8g\tYJ5۶yx}~L!) ,2$H2[eY_jLUS&Y^2y[:VOz}utHiergض%j]fLLA,˶fQI #S_I%n 5OފVדޥK l,J|ZT}.7o8/9d4M0r9]> LiLgi8۲PDS% QIƓB%@VǍH穒Pkk`i`weMRn2KO>rN x<G:8""@ @:}`{C N& C0u L Y2K qܤItӲ$ܷ([rյEUQx _2wr9+vaۇ~0lVܶۖa8-\Lv6t bUUK%N!oذt"aH磤^a).ޯ q,ǭwDՙ&ؼnza"-<ȣ57`^ eTSь9$5ރ9}ITD,r-WO剛/桏 ~wf'Hm#~:Bmno/\f<}rI%hYЈ㤵={P&?ϵW@MU=!4&bhZ; s׮6&4I%5AcN㷿9 E1-_<{ 2I&$m;M/ȊLKKk֮FADt- i>۲4 A(.)"ؼa^2MDv#siTs3c?1Z-`ѺO=s7?WBoAVPexgg$yѰ|.}4pbN:LwIJX1Del%Ot'Tnl!5JsĢu3ABSLhge} Io89aX;3?'sb.ƺ1R|N(GM*,jjYfeT$YlZ[ZF+n$)ݕfIA3[?AŵTpM/>Ig]q0ҢBV,便?f޽{at^ֵ$X`6Vl7ٽsG`sa]X;^& ݇rM4o[Gc:ʓ HĢ?mХ[-]ONze$d>Eyl|{c>|E^}{EXõek$/fqσOTxfs?I8=ibXfG `wD$IF5ib6h`˦x y n@w&짆Ͽ OM'zcwhx=X}!.=:qYx# Rҵ7W]y9u\]}U+R9fxμ;|o sٍSG"={7NA-Kg1\~~KY$V|?W@9j\}կy\|$<>.>ĶQ,^@ԛ뮻RDgg9]~$IH{{p$$HȪ J9nBÆ6uTejunBD5;SD}O>;'oiɻ<D td#{sE6b yYQT8x+ )gÓCyJLvn~[!"''[-VH4R).d9lXg!D% 01u۲$χ`&鈒,Kђ{t\x0>kO9WEܰ6b4 B:RI Ӵqy4m]K4 ؠ ǢAkFB i]FxҔYBaYg<%L,ձRܡ [eG_p3gsgOea/˶MKY-D<cҔYBJ (" "9t0 ~9Ja$aw$!~v׾'6Oӟ8!l[1_.[wLS0O&0vd>xevx-o5O>=xGu$zwe4+q*$^2QҀ|?\A3>F~,skQ!ٰK][`H~T@ p UӷK1h2B ѧCMeym ;=*ٸn_-_EQ`2l'4T,]nù⋨-mcj"VDenZ:fii\YYD;΂(|C >"^ EnCEܞ},)HdD*:wcGŲ4n6r2XRn 2lTU͜4E1IJN*e7q8PWb`SS%99p!W!`:Fu***}?rL} ltM#LbY6ۋԔ?ۦEQ\ź͍r* cYcT$I BR +}7.g'7(.s3Ň\DXv-eeecÊ,a ],u]}˲|]D]pi(mKXP5xmFs9v1?~ƲD"aN>,CVV<ض=ܑ%R( (ebuV1Si-H0$++i_;(l7aML0=nT#`"p o݆Ȫ$47娊v'ha[R deҡMB2M|^/Ͷ@nn.]j9888eۨnyDF",rtP[Ӷ$BvGz `Xe%47σEOS,E=Fuٶu+p#=]-T6-/\ȒiB,2tT:|~l%5nE2IJ 4(`m( X,e;$dIF3u|݊(RID4xIQMU7,X((kئŢh 7PTnD0L#-ZEҒ24۶5`Z&T Xڈ IDATX-XmHȤҩL>Drؠ(J +v!NDZL[dOɲA^t9˗D4A fƘ#=]0u˲2LjeN;BVUtG⿃dYB3uy%IB2Qߏ$J$vH5 55a޵pppp/²LA@eTՅMZKADdKeK1Mvqpppp ""#a" H2Q\|>Xd: dZ88888| nd;*L<C4dK~Q6=6#M*˙#dlEU~?u]jFRIU^kT 45 A1 Ie9L3o L -#<]PdID 0wWUIT, ξmS'aW.79ymY])$ h$iiΧ*Nm4MCuw I"ƴLT*瓈F# X6$`&Nd aCŲ2>(A4Eu<ltd2In^>a҈D*aY6 Fv0;裱)E2Hpp+ M^^Ps/z466fZ=L%D뷠(*.+UY4mܪD#X CupN 2? J*n ""ȒXzt}ШƵ)&9ǭ҉(IM ;$"QP\xyY>lˠ[vWXq;5]е4m$o-"v[Bd:aXT!負# Y~?o=n.:딽 D邋 Km#*"7"kcђU(>Ͼ?Ny+bH0 奅{L5mbg.L_`MFϞHh E۶/[1gL>]ʪU^xI:gof㑵|&_z>c_ RWV@<«/+oL_ZǺ?ཏg`,Y3Qgθa]KɔWy**SY) KO/ׇ,`p$m)?> 3WW1W_FxiljvIR*~/)&s)In;Wʇ.;X5M5;m)LxsF W_dE|>ϞGBPW[+yg80I$98ꋯM8b#DA3 4!HC>iS=)$`t =S܌io]|ek7&VNF$N<KI/>MHpu(-̚p2(XA[k+XXDsݝOOkA-L8  [↖5J8,t]%5t4tRnL`94*d :MyM,"&N`[c[1Qs3f4znAb&4l_RgʩGуb֮XȚ X`[Z♂S?oןNvVGfOYq, n#ގimA醁ai g֒(xyhr:6=-P+hl$ֱLPX< 4DEbgؼ]1W\x;ןGimi%;;F,&j0]h"vZC! NdaFst9yLs]y=)}xxmlz:qNouv#gs$R.H0-Ph{L>5WrWsqm;hBD)_|)G a=G4=Kx~o݆%)/'u)!64EpƎ?y/lK.㴟0|,(Eսk˾ɧesqxe~쇈#\ES3w޿(\{r?x.{ KǓYy%t{%Y/7ޥ瞸b]}u8sfәg1q~Yw HiQ.esNm4rgDOSGn\_]y#@?U1=FxY=75kuihh"m }\uQl[ܥy=}XcO3Ꭿ7l%7)c, |fY/kϧM}B"3 ~rڲ<|Ͻ6b\p 4>z&MHj|\}%~;~wޟI2S0.sߺw3go }x.߇y՛<Ft&gk܌y,>()ӗpE"[/#/;VreҸgsWsu+:LUi{+fWxhnpxeMs+_,XL{8JqYw`K(.~1Y.Ov7~TӅS8BI#J#Y~8X6@YQ'UA PWT1 y WqMp#$VoC"~W]{1|<=㗗^N'5C nO +poa{b/xx,] M_|V9ޥ>aFybsmqIGr(yU®x6bM+ykXŇl>NCo/Va%2}|:Ưx⍏ғa#smsPhDXՅYqǓwj[Sg0'*]ٴ &<w%κ\ʳ.y]Q:|T-*Ơ:I'~u\~4Y'/'J\C|2ꆎo[ {JFH|cLYwAi>:'}_\έ7s'sCϐNXlfp cSwNl\߻oaڢ۸s|f*ɼ^r Teym ڒ|8{F3vQ~hpU("Z̖k )=WW}wv *& W'oOde̝>~}_qǭ׳xW0CbfrnMM ^b0eʌa"B@pk‚l&in "Hf6YQT $ކkjB=:3}P Vѹs%f6USP҉3ν}JP͔NeVN~7;#baq`coē_N~&u=_Ʊ'g-b]jk Ȝ|s,A!O͊/>@>|9w>la^ZZ.=<<6 N<3ν#֑j]ōŏClͬcx+gȈH|#5ӏ"PVͨq'2x`_\̃OMbcC~m㍏bjޝXj9+V爊N`Up5PZn\/#C38ɻgeSTG3l֯__$ꪊvC,38(B|AS<(+,Y1/iI|1#(KOϨc9q>gJe,YE+6w7kel\(z/δ8?\@Qq2]Kt],=ϸ'vNI_+oQ/W5~D2eZX,K\.$Qʸ[AUeZ*h" 455t=AS[M8SvHe!ѷxE 'n]Wq/zgA8D(5+1xx7v6mڌ(H|p笯o$fWEe^3cմGl_uVWIq^`VN<ls/ьԙT2eڶ򄇙lW]{٪I8a{6W/{dh"`{]lZgɧ) Ht't6] ޖFt+3 ԯ]m۩.F4xXR1M_^1' ėXnsfeh߾s?'bܬ_ MDڶ3e [ɷo\Tߥ5azmGw|i3z^;\VN-MYfdU ?ᥗ$AR0x˝c $Im^śs>cAq n`xw>JB<a BB!th' H2Xv`$t"Ȣ!mgiQ؇#Af{to6jOqzQ#F?<@"Ɣc×~25A=y~sí۩ elPc=IM23!~co.cjBm vsN ԯX>H$kn{mgF˫5 hݲvo5 8![po-cj1fM.ccx3.В<9e|xL}[ Uo>C&.ןKd*ot+ft>n,G,/<]ї1Ga9KvaJsoSP.ફ/'pGD\e ؝>'_SyG0v)ۿpV%ݾzҁc8k |W5 侻F'ŗKpwm˚g%_'ۭ`T'YK`$~-_a4?|<Q_.]#kn ̰]P$Q#GǨt Uu)"Q)2~qYsz:WjٗB>}1[9Ϧ1'rN V;?^fۦlhqmJWM7^iWǧB-y⑇x;?-o )e`caD:*PIJ~ɭd4Uqؖ瞵HUtgdydDYj>( juSUٔUTSmq҅PYsx HJaiݺ0IH8>μi qÐN=TYrSӵ'cǜHueu%?M皮rС)`I?đpTVRUZ}}jm>^.e9`۸<~vAN_Omndy=Tf`>TQVVFyEgv%?ںKGj_EʹKײ\E|UCҽk͈aҭ;.!A[L樣`:WړSƏ{M"oΙ/ rG2EuQPRF.u\.Jj׫'ҵGNA'?墨d HWVӫoO󨪭.=ҹGUMWq^㥺 zf^?U)σ ʜ9_V.յu K"y%tޝRtB~n6n~CFp) _\B]]5A WHҥ+u5ux=nY91f,G`Ir򨩫0Qޏu=zsqt*CEtғaC'';rq4:oPEI^=z ygҽG7 rY :r4gy*e9n>C8zH_r9qܩ},~ ĺ/?enn>JΓ]~(# sgao nTWdUVӅΕt\Kb* ڵ }8L#@Ρ{Li,|^/>|񶈈KUu=ƥh{7L۶hjwx w dbnR-\wM <u8Dz3N3vwv;g۶PTxtmsg%|Ve$w83TrUd_qՅgp-^wo3q'mX&X6t?{ZSadtJc>A/; E1Mt*IZK!)Vߤ'Xb=]wxFUdl&#).\![4{ IDAT&k-bm =j~銖ir' ,EAC9ȡdTM=M4eN8 UUɳeL5]^z3?%sQqp;}D"`i\&dE,LD%ADU]GSDL&LE0Y$~x$ $I)ݷiz)^AS8eXȦut* \̄UUiooGu~T]iooGRDIQDU\n7abY&r0$Li؉pUY, Fl۶ ˲{@$I"xHUdI&m舒(Z`hi`9J%A0IV{GQrrrEJ`mʲ#È$Q23 f6BM L88) ?d 0Hb EV0t YC L6 v,L:mXlZu%euugSa7@LO2IJ L #F"l $N#2$aN a7*XIyE9%%%mY8aHB"Ș Ha7 UAdM`g:aT]t=%YƲL喎BM7eő.T\`i&m bYY)6 J~Ρ톎 ,xm#'I\e<*FV aWvIHB&*"68u=ttrz;tlMߏ"IKEevLDwgʭ{wvvU:bﱗDѨkbQ1+"齳 ˭R%|u_3s3yy>σmZ8vt4-)"u8 逢 c8(p۶"zA-;|d1m¶UG'%BFzeYHdry~0hjjLWQ222((c j,װ'tJ%kJi~>-!H*A]gWmw%ãEQņ il'SPϪsqqq9߇T%`I4=_(-L!OwoeKmiI$rD DU5RRR[H$z=**B(* 8h %>) %DS5D"477'NDܾsqqq9Ĝdm&yB 0h"F ;mz...."U #a`&!465))i!hjh0 TO~j#hUTLA5e쪳8f Bn֊60c4UEQؼ+Sfs.5W"?pj6.g6^dj',52Pe..._q4]G"@8HBQij$ w?*F_+f?G])g = !$H3{je"Q)!T!IHU&mz_5棤07yru怴,ߍO!7;]S?W*ʉY 9y|M5쫋e% PQ^xc..?{UJb E(ɉ{RZZQfK۶M@R?܀'z{lظ郻pYW eLNhcrϝPp 9W_ĄgeEc}= G|\Ӕ1`4wFJ3LmC6]ԣ_|Dt~ }۸ ؞5A#Hm\OoIȽ\\~fhS|ضE<2MINkɗ(BY~œJu8F=?Ϲs71WXUe2V.\H]TWױujfLң:MÈ9 ?&MK ϲ&qg$h^5Lu<|0 oLkeKӰwyN/̙;;o H/&1wc{w^A]1Q)^Y..?C]J I$ 4@14 vEŞ?92M)qVr©gQttC#FbEl./SwREULCAۅ$ӑ60jNej7kwӕ{<:e2IT5H %'LO=y{0t@ ~7ߟDf^+ZeS:{euq,!#d :j ҪU$G'ímS"Yd5EQTEJhrcXFW ۾`vİn̙9yc7g/x}㱡R/Xv1g<Ӷ5龖]T&q3yԖcc„CwscQc5l=Jrݙ{],iۘI=$bqL3)/@T vli!QFf66n/fЃp]pzZ)xyؼ}z v/$ӖlK7Qֶ+Cw_w0:_x!1Zz.̝g6бCksC #/3=UIپjv>bҕL ?*`[[;o/+3Ĵ,^/YXe[h,/D۰q3 MUԖaR75V=A:ƒO>>½|VFx"t*B&{vSΝJ)*)9e^QEK!o!Bq矞k3+=b}z#LNV+3mm.ƛz =|Ii9zzW ]UmjTtvHW5D)yɔ*)1mr'փq#@utMp"!xKx]^kL]\\ZH k.i >EQ,$i*<QUH4[F¨jZ?M8*>!T>\\\\4MtM#`& m;ha*'N[u*) $he^PQ@ $cHp\\\\BJm-e hiP_װGb{....T**FNqmpѩMo.cw=|a|ovҋ/[gafM.D%X]2^Sa ?{<DFރ5Wҵy^籿L6zsӻs}wK:r-oRh-A2\ȯ"G! H عsX лS/wQ۲1z3*n2_b|_LxGƍcQzΡdc.toxoB5 }:&69̓bP2qTNzW^$u-FCVY4?|?O;ٶ4"Q),.%3pֹGn Dž5/rkT)tл_5&,NRBYdhs/=G~=}|3qT95GC<ne~u1S=Rn S\v9}P?8O>q y)t*}1f}Yń{ro#52:H^X;w$3L- iX, Au\HXN~) ʗscqͿ'o57֑:s=0io1u_do}~}2l`EZA!|曌խ229z kضs'5{mFs٪u;MNA5lg{98´)25(H#ko]\юd1kBQk7DO/ϥs+ɂEi(uh/氧!/gy4 }n}m]p>(p-7 5#N>Az.1\ů~1 $8ē?ga&'mF^-v-l% M:t,6 cc }k6r#˯7ɑ2cD("O{T+iPE@cCM FWGu~wHf h2{?R纖C%֭l_UA,nn^ySҲ[ێ >{)QT3} X Gtm%;`Wu>h$L(5Dj(DuU v<BQC==^Wxk$| N?cǒ%ң7;}}UM@Z(HÛJ`үo.T'=N:օߺ ˘.ꈞkh;hZw4aRؾ9锓پj)GVvǵއ;dʫ%^^HؐB>v,@J% !ڏ>,mDZronMV |28[gxi.x.sb9 +O'* ?ݷ_⪠*$J%NM &Dڲ$!aM4Ulަ/NgMlZ/S{yYi?".?x3;{Sټfa+e_I+xgxw(2ʷgxi<*B(!--͘EϷdyO竸[У-א PdO5&J[3L?[?+ӦϦ(īH{PuohF(%j@JEA4 @e44SQÌ#qM7a&]—_.c 7mV1vogGE3g];*AώE~!:iidddPX܎̐p-dMOM''7\rrI |_g͹]BlZmFYvqPFj ꒓X݃*~dv z'Ȇع8-җ_HC\w8~%@ݨJpoh"0QZy%D;\ )mkѶ/dgu̽)"|t>Xa8(h)@t b[AKrmweضn1F<gN|7z ӃYc(!%-+.zBJv~}zѵm'Jvn]:'?:E}hӾcFǫiT:wiOzJ]У_>?iST֋[ng 7ޤlę \rP\Oj43 #;Ҏi[;UWi׹7(mߙ>=&S槑K)u!Y~EpI')k)%FvmPPwţ(hTJtUUR9AtP)tޙP YWx!Ju0S:5Jrh,1rч6QwDVV&*jKvm)hyID,. O'3G:׿$ͯQԶ=~IyMkyۻ̏LflFU Bd}Nݣz~F4꩓W#gn禞HSOk.;7M?Zn8Hٕۋ#Pd?ضeY蚆P:`9&tА7=h(xU rA>hY/z>&JMu5ddd$kɤXYff{....> )躆xEbH$A"GUT#MnﹸftrZ%i%3$n5*L˕sqqq:B(457#$H$P#a86B|>!m7`>`EP Mq4f[6&p, MUS(kۖ7yY]9lUF]6gvLP渕]\\g5V%2,LD$a8BD(lݼE^\eN/JJuWJ!݀W{BQ~vR"p= APUyz+l-߇#!i!i|?njk岫ncӮ#uuu6lX&uuuDkeOpZïMأnk%>~Knܽ{]4 UQRzPT2JrI"˶PU]),lEnn.!i^0mPE-!6KZ5}iZX5o"w;5Ŵ )cŢbC+Jx_rP. {4OjTʤ%d@dx[lSݾ^ rٷn}>6,_EEt,taxwpR/<'ޛZxY&LO -pz6Vn>Uyf2wgڸUk'ƌo'sIxxlӦuW.ߡ9´wÛCnfW٧iZ,!4ۯy7Pe%?5SɊSxꙗV㬪O'sPZލt06i<3`ɼ 4~²,iǑ$'օHAlhJB57FI &uh\?= mE~'˘/փZ?N|Pz!cNW^zzdYUZ>w=qK{.^0awG0='Eg#pFf5@Uhn5Ac}A(=_@5WRxU,ݺs"g]t-lFm)j"\WGh=*ēɵ\If台s)gQn =sox\y (/f"n."+)T6r(&cO;”8/"Wq,ڝ&fL-K"%-:bN_0ީˑAE(hئcDc~TT"91*DG:X¢cʹ!d91l5Ks9k8X^+"m;tLc&lthWJjѶ݁S2(*(kxsJؽMZ64n~ Ԕ4etѧHRNBK%8QC!*0aH$}(%l]|<  e2 s-nf#8wd*bV<$kjxJdK])8}]_-yuIE _[ޛ8{1iģQld 2Q4?Y 6`Y6ц66*]W-4T3}LF]|3ӧW$7e2z|xu4G ld,_9s O37;;:Lٙ>MxNh.G ]װmeEŖj:^-@:M M^nLUjl2GOء_s=P~t,೏ޣ/jjޚq?J,N={?ESOɵ%NNA.qX E_ciԮ3/u{=8 5>|UWa=Y4}2JZf.V|>ssv2iYg(N3}JdŀQWUΔO>3⑼ҝKٶ/wu吣_04GNzkׯfd?>OXIn MBqn.|3/?P8%d)sOq: ԯu}U_[HN: Eeu͢r?Q()++\+I-+.瘣ڒVU+WӶpztLaTV'8+ADXh!yeVl,6u)>V% gWEG=#8qB9%tXޔLJn_.eJz Net 3{OA@"Cҩk'x#:ӭCHH ֭JM!%5#J;`qۏҖY~ed%YrcuQGӻk)Ylݲ 4=7@ wѡGO?Tb8‹ԧ^Qd5Bt\WW1ޥ6vF;Ny=dR|ٶ GˣG|>GYIkStV\*F ~qfa5VrZRDמi]::vį8,Eըٳm.:fu.G&|LS8U?e[v#NF +3۶hhh@*~ʼokGyھ澩OpB[]#x/i?!9|Kf|BQоGz#h{F$;5.G%GEDatDᣥ.TbBI`#,dömE=0Mv޹od <^/I%"_:hRQBUxtvWU⻼2U#-=ӽJI(LD( O6q"rC}m-XE$5ֺ'3K-&Ķlb(tW5vHMIAT*+*qpL[e....?Wl2Ml)ihhH992?UT}{VPvUEM@ A$T4]O8ؖI"@aˡ|sx(A"$LM:he6R!`'xͣcJ ˱4MUD\=}~PSu{ 4M/>/[?>ME Ʉ&y2dyL0=UrME( IHcZ<ǰ,,|r^MnﹸlP2- "ԖPIiv"YwhǶJ=pdR⦎z[243O-mxޟAՑ֒/RkB (tнʕ+tqqqҒK')* ұ}(40EE䗟&ڶm I5NjBH'|ʑ6M؎h4Aj;vDE0-}Ӗ-Ƶtjj*v܉A  vO]\\\86B躆i8$uEEkllǶQ4 2uADaм|mEcsP2UԈ ?D mD"qj|Q8T-99%%MYt)1Tsؙ~ƾ( %zCg`G)~akS8( 2 &Ox'pQ?A!%;.fƊj. |ډ=[2i>ǟs^qBnjہV|އPQہPZh?Bvl5Y"=# !TLzmk:J8!+; o-ǯ?T:P O^c֋'$,"BUzΚϐO Ɋ_`e_xmIjvogs dt&ynJ,YBJ"Mg!Hf΢6b0lGV?9B$+GHhYGeѢWOo16RH i11~>;q걭`ά쪬%v"V.f/ȱFllz {Q:vob*:iŞ}*Y~9{5JMx}~w|釬mp8c+LY4f*,ib6Sd;O:y Z ٚyŌ/1KGfƲ ږ2XcYx :ҭc _"/·q~4%7?Djn+71yЛT]v17Tٰ~q&Y)VfO=M]HYiVL Wҭ@2Os9/_[&ӮPjODL4ÛYոߚ@j.oM۲7}9eQqPᇷ_|x6*䅧潏SXSdJʜ ǧ_!Cr }a"J:1r@>{<{Sa>?JCٷn*<Q-}5CAfP;oב{Wf UQIzY%mPV?n4eW%mQo\# G6[7 Ԁ'SgMX-P$N-ja& l;H,BUe88HCh|#wƸֻܣ}8(jǮk'vJgل/>uwRy$^l,^cF@f 7G|&*/y㕤*Wgm6:i]o.?iD<$f/`xZe8 p: 7^MnFcy ?5DVz 'w<YKF%לwAJQImr-c.C"2'NC)_IQϱyӕ6ד0M,~2STEmIE=B,H@`[H`ii>wLjJ-"T e*?˲ڍbPMI1k6ҨS䭿c*vdNؑ 2xeL#ͲŌhڱe*.8-¹qN)zql+ cT,ˢm1isR2ضM a0e▅iر7F?#F}Y/܌mbo$;˲tιꚻg H(Y ^@!!!A $x-ȉB"pBrc9mҤMl;]5sܯlGy uZgkڼWFw;N%s/ wM.dˉ21-ɂ{mò ;1F56WolE߸D5&&r.Ƕ֘Lv}oGv|o|?<_:RS/ܢWLK&+be9y>?!s5#8"1>hPQr& qʛ163羋~ུwkh0:pm7&%tUc{~6927^c:m1坷.!B}x}'^[[oqu.},f'S.έ{(ebO? mѬ,2!og59%L*u蜱!D<̗s""Ԯ[kܻ+/1g>>gPpl 7;Ǘ_wW_Όks=.Zv$<r*?zg?<"(B2(ҥ|~OGo.O]}__$O~bx=Sz?ʗ8ciyիW8vdywXO?s-Ο=oqo8v Ͽ)y;WwyQ߸A5?#?ss7nrm^ 8{"x3c`kCDžg٨_ۻ{z=|bv3SpE.>q#kW;=?#[lm.r5ܾ Vyp;o0}Cm㩧.GIW^coos/|g/؉S֙+o_eg}僜¥'90w&~ '?٣uwx+W? a>U ֗}2W~YOT_LZb1 6FN|G2Z+vvv>Poiٔ{arnzu4vuރ8kl: V+rp΢"< C;q}CDkCUU!& 9UH)h3UU=@H_y ~asmuӠK[NHpm,/3OrE~g=?Fgy\U7C}עM䜱rvtpUݐV5Z6Tb.PI du]C}C<^IWN[D]7co2˫ԕ[h|2Ce]׿wwe}ZZvL1a޻($Wh\x빡|Texx=.7c+Vk&ϬW!<_k:kJaXܺ{Y;4~^q|o_=f-Xٟ0k[*'d1 htU9~QSKaՇ׷X1=^y٬;|/13%L1dZ0Je Z^GeTUxߡԼ2Ev1 UJ"+)ɪ1| # Z㪪d)rdA)*X\\dggPdW" uu]} xԋJa21&Ap)ERʂss4Mޞ&Zgkey{nD*cv&tW~FBF~%7*Y˜S%wvH=a^ޙC}_kQZR@\zIR= e5c0Z/cprsg*NND*x 7|nTDl! #Ch`N+J?0ycИrL2>oC(O1&2(U>)礌s*Gy֗덄.$QJU!_Ơ<3}$yІ`M)rc5)Td.Ȓ#-X+k^#2uG,i˵w}oass ږ}uXh;1R ?`eTrƔZ7u6mwUx): cb KBa@]׬qb8kRURr͈)a)iT7=v7oqKd"ƼRJʅ5Ÿlmnr &)E:j2b,`e̊uRJ.blbopPT,k{KZhs)1Nͽh. A)j$c&ڶec}{2)aE] #iVVs)!Vzΐհ(g618w( M cB#;״dABZB=8p#9S׍)t:`rFi_Ii8-RZ}\s]m14:';1~ r$q؆)|xAkVVV/7Y%/fLzTtҧ1d,Y|Y2;{;Rd9蝉 tƤuDW# "FI^gّK 5`1eCgYi WU,-/S!H, b4ՀUYNڕǠNce#TUc{ /V1MP(̦g.EꦑFh" K ZbiJ, Wu-ĈQ[X\*HnF4(88HY[['f)$J':+hڶhc-,0k[F1XB(UV 2FH&X.Zbd:R1AifD]7(m8v8(l֢f:(FX[ UU5Z[Њ#RQ :+Ļу7Ʋ*'@B)PƠ5zԨ Y+s8 z@뛛81!FrA/2J?|Ӓյy)EID}[XXZd:abJ坋BEy*mI)/M9{pU*bGSUDt29( ZA1@J(Ak5uЌFm+PkfLJHL;ژ!S%JSZ5{~yymПicd^)c\vf^7+fĮ u3C9'h32}3#1t~5ͨZƔ~US}*WKȥiųg_]Y)*r)@%$`f6sk\UvbWhV{1B)L&9Lfi-r-`!0kgcΝ;=fw]AbS* z6]GJ8NnݼuSsItBb kێ="#i666+0oiit*ȲX2YAJ+|pJ!,j]ױSаx/U);׮C(aJܩVGvfhB`ڶ}!P*`rOSJh&,s/5c,1x g -c34t|1ȩ9#G+QA*&yF S,XC APk)!v6`43P3F9DzHR`._kM{lB.hR+shE=FK:U}Lu ?RN %fmk-rdO}聯3%>PW0b,A=7=%⼪|?E{4FB肚{^:~Յh[~aNדrh~XޣmXkK!57rpfqV=w aTx~RzeZ iш`-2' H1y?g]yϞ% Q(UȃlRPkK-􄱆ʚ?#TM7~>K_NSlYBsf:hߺ}[&y 1.RQI޽{f3LjVZBKᎀ"{61%fVxԢ'E]Uz0/NIĈx4*xΘ|(Ek%/'zHcF&6t1ֹ!ᥴԂښ2dA,Uipu^&0bwo3KKKBy $RNCX Jx<9_ *hN09!19f-L.GS fLA}X:]udmuUhBSd^1q*Tqs}ܹ!+H' ͐d38$P4YQF9gva4*aFU^d\Pv(ƣ %pU=j,n,>Jw^Cd-I4lBQiJ䜓DWYYWBh1G.=hT nekݕ,|I>eR$ ݵ}bYJF  N[99H^8yYqnNv_B4v}WI`B]U?B}8nH2łPJ¤ғJ)m2| eaq)h@)^Q75MS"ȨJ۵> _U}R-բذ -hHSaAi!}HZ;Ld'O<ɤ~عa/SGD׵ЃP۟؏1Ze}wap OGZīS%ژEu(J ";;T}KHaL'Qh1M3Zj^$%b676ڡB$F9G_MuUQJn:WU+p~М2)] s] 3]U '=ZrJ© \P E\uÞ끭.Cyio]t%\j,4$"ȩ$sXbJII 7,뛌F#&ٰ# 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, sys, platform, tempfile def file_list(path): files = [] for filename in os.listdir(path): if os.path.isfile(os.path.join(path, filename)): files.append(os.path.join(path, filename)) return files version = open('resources/version.txt').read().strip() description = ( """OnionShare lets you securely and anonymously share a file of any size with someone. """ """It works by starting a web server, making it accessible as a Tor hidden service, """ """and generating an unguessable URL to access and download the file.""") long_description = description + " " + ( """It doesn't require setting up a server on the internet somewhere or using a third """ """party filesharing service. You host the file on your own computer and use a Tor """ """hidden service to make it temporarily accessible over the internet. The other user """ """just needs to use Tor Browser to download the file from you.""" ) author = 'Micah Lee' author_email = 'micah@micahflee.com' url = 'https://github.com/micahflee/onionshare' license = 'GPL v3' keywords = 'onion, share, onionshare, tor, anonymous, web server' p = platform.system() # Windows and Mac if p == 'Windows' or p == 'Darwin': from cx_Freeze import setup, Executable if p == 'Windows': executables = [ Executable('install/scripts/onionshare', icon='install/onionshare.ico', base=None), Executable('install/scripts/onionshare-gui', icon='install/onionshare.ico', shortcutName='OnionShare', shortcutDir='ProgramMenuFolder', base='Win32GUI') ] custom_info_plist = '' elif p == 'Darwin': executables = [ Executable('install/scripts/onionshare-gui'), Executable('install/scripts/onionshare') ] # Write the correct version into Info.plist f = tempfile.NamedTemporaryFile(mode='w') custom_info_plist = f.name f.write(open('install/Info.plist').read().replace('{VERSION}', str(version))) f.flush() setup( name='OnionShare', version=version, description=description, long_description=long_description, author=author, author_email=author_email, url=url, license=license, keywords=keywords, options={ 'build_exe': { 'packages': ['jinja2.ext'], 'excludes': [], 'include_files': ['resources'] }, 'bdist_mac': { 'iconfile': 'install/onionshare.icns', 'bundle_name': 'OnionShare', 'qt_menu_nib': '/usr/local/Cellar/qt5/5.6.1-1/plugins/platforms', 'custom_info_plist': custom_info_plist } }, executables=executables ) # Linux else: from setuptools import setup setup( name='onionshare', version=version, description=description, long_description=long_description, author=author, author_email=author_email, url=url, license=license, keywords=keywords, packages=['onionshare', 'onionshare_gui'], include_package_data=True, scripts=['install/scripts/onionshare', 'install/scripts/onionshare-gui'], data_files=[ (os.path.join(sys.prefix, 'share/applications'), ['install/onionshare.desktop']), (os.path.join(sys.prefix, 'share/appdata'), ['install/onionshare.appdata.xml']), (os.path.join(sys.prefix, 'share/pixmaps'), ['install/onionshare80.xpm']), (os.path.join(sys.prefix, 'share/onionshare'), [ 'resources/version.txt', 'resources/wordlist.txt' ]), (os.path.join(sys.prefix, 'share/onionshare/images'), [ 'resources/images/logo.png', 'resources/images/drop_files.png', 'resources/images/server_stopped.png', 'resources/images/server_started.png', 'resources/images/server_working.png' ]), (os.path.join(sys.prefix, 'share/onionshare/locale'), [ 'resources/locale/cs.json', 'resources/locale/de.json', 'resources/locale/en.json', 'resources/locale/eo.json', 'resources/locale/es.json', 'resources/locale/fi.json', 'resources/locale/fr.json', 'resources/locale/it.json', 'resources/locale/nl.json', 'resources/locale/no.json', 'resources/locale/pt.json', 'resources/locale/ru.json', 'resources/locale/tr.json' ]), (os.path.join(sys.prefix, 'share/onionshare/html'), [ 'resources/html/index.html', 'resources/html/denied.html', 'resources/html/404.html' ]), ('/usr/share/nautilus-python/extensions/', ['install/scripts/onionshare-nautilus.py']), ] ) onionshare-0.9.2/stdeb.cfg000066400000000000000000000004341301215300200154350ustar00rootroot00000000000000[DEFAULT] Package3: onionshare Depends3: python3-flask, python3-stem, python3-pyqt5, python-nautilus Build-Depends3: python3-nose, python3-flask, python3-stem, python3-pyqt5 Build-Depends: python3-nose, python3-flask, python3-stem, python3-pyqt5 Suite: wily X-Python3-Version: >= 3.2 onionshare-0.9.2/test/000077500000000000000000000000001301215300200146315ustar00rootroot00000000000000onionshare-0.9.2/test/onionshare_helpers_test.py000066400000000000000000000020321301215300200221260ustar00rootroot00000000000000""" OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 . """ from onionshare import helpers def test_get_platform_returns_platform_system(): """get_platform() returns platform.system() when ONIONSHARE_PLATFORM is not defined""" p = helpers.platform.system helpers.platform.system = lambda: 'Sega Saturn' assert helpers.get_platform() == 'Sega Saturn' helpers.platform.system = p onionshare-0.9.2/test/onionshare_strings_test.py000066400000000000000000000033321301215300200221610ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 locale, os from onionshare import helpers, strings # Stub get_resource_path so it finds the correct path while running tests def get_resource_path(filename): resources_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'resources') path = os.path.join(resources_dir, filename) return path helpers.get_resource_path = get_resource_path def test_starts_with_empty_strings(): """creates an empty strings dict by default""" assert strings.strings == {} def test_load_strings_defaults_to_english(): """load_strings() loads English by default""" locale.getdefaultlocale = lambda: ('en_US', 'UTF-8') strings.load_strings(helpers) assert strings._('wait_for_hs') == "Waiting for HS to be ready:" def test_load_strings_loads_other_languages(): """load_strings() loads other languages in different locales""" locale.getdefaultlocale = lambda: ('fr_FR', 'UTF-8') strings.load_strings(helpers, "fr") assert strings._('wait_for_hs') == "En attente du HS:" onionshare-0.9.2/test/onionshare_test.py000066400000000000000000000021711301215300200204100ustar00rootroot00000000000000""" OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 socket from onionshare import OnionShare def test_choose_port_returns_a_port_number(): """choose_port() returns a port number""" app = OnionShare() app.choose_port() assert 1024 <= app.port <= 65535 def test_choose_port_returns_an_open_port(): """choose_port() returns an open port""" app = OnionShare() # choose a new port app.choose_port() socket.socket().bind(("127.0.0.1", app.port)) onionshare-0.9.2/test/test_helpers.py000066400000000000000000000021051301215300200177020ustar00rootroot00000000000000""" OnionShare | https://onionshare.org/ Copyright (C) 2016 Micah Lee 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 tempfile import os class MockSubprocess(): def __init__(self): self.last_call = None def call(self, args): self.last_call = args def last_call_args(self): return self.last_call def write_tempfile(text): path = os.path.join(tempfile.mkdtemp(), "/test-file.txt") with open(path, "w") as f: f.write(text) return path